我目前正在为我的某个应用程序实现应用程序范围的键盘挂钩
这是通过使用覆盖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;
}
答案 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