IMessageFilter.PreFilterMessage中的WParam值错误

时间:2015-06-10 14:04:36

标签: c# winforms imessagefilter

我目前正在为我的某个应用程序实现应用程序范围的键盘挂钩 这是通过使用覆盖IMessageFilter方法的PreFilterMessage实现并将IMessageFilter添加到我的主表单来完成的。
至于我能够测试,大多数数字和字母键都没有任何问题,但是当谈到时,让我们说Keys.Left(代码37),WParam Message中包含a,似乎是错误的值(代码39) 是的,我已经使用Keys.KeyCode(这是65535 btw)进行了一次AND运算。这意味着它甚至不重要。

如果有人有想法或暗示为什么它适用于字母/数字键但不适用于Keys.Left我会非常感谢。

代码:

public bool PreFilterMessage(ref Message m)
{
    if(m.Msg == WM_KEYDOWN)
    {
        _keyTable[(Keys)m.WParam & Keys.KeyCode] = true;
    }

    if(m.Msg == WM_KEYUP)
    {
        _keyTable[(Keys)m.WParam & Keys.KeyCode] = false;
    }

    return false;
}

1 个答案:

答案 0 :(得分:1)

我在Numpad Keys面临同样的问题。

我做了以下事情:

VB.NET:

    Dim KeyPressed As String
            Select Case CType(m.WParam.ToInt32(), Keys)
                Case Keys.NumPad1 : KeyPressed = "1"
                Case Keys.NumPad2 : KeyPressed = "2"
                Case Keys.NumPad3 : KeyPressed = "3"
                Case Keys.NumPad4 : KeyPressed = "4"
                Case Keys.NumPad5 : KeyPressed = "5"
                Case Keys.NumPad6 : KeyPressed = "6"
                Case Keys.NumPad7 : KeyPressed = "7"
                Case Keys.NumPad8 : KeyPressed = "8"
                Case Keys.NumPad9 : KeyPressed = "9"
                Case Keys.NumPad0 : KeyPressed = "0"
                Case Else : KeyPressed = Microsoft.VisualBasic.ChrW(m.WParam)
            End Select