首页 文章

使用Windows键盘挂钩时,在键盘状态下错误地检测到SHIFT键

提问于
浏览
1

我正在使用磁卡读卡器 .

当插入USB端口并打开记事本时,我得到以下结果,正确的结果:

%B4290071074381429^NAZARKO/C M               ^1302101000002024976000000000002?;4290071074381429=13021010000020204976?

当我使用调用Windows API函数的键盘钩子(用C#编写)时,我会得到不一致的结果,例如:

%B42()071074381429^NAZARKO/C M               ^1302101000002024976000000000002?;4290071074381429=13021010000020204976?

正如你所看到的,这里的问题是第一个'90'变为'()',好像在按下'9'和'0'键时按下了SHIFT .

键盘钩子代码来自这里(Keyboard.cs):https://nappybar.googlecode.com/svn/Keyboard.cs,它的设置方式如下:

_kbHook = new KeyboardHook();
            _kbHook.KeyIntercepted += KeyboardHook_KeyIntercepted;
            _kbHook.SetParameters(KeyboardHook.Parameters.AllowAltTab);
            _kbHook.SetParameters(KeyboardHook.Parameters.PassAllKeysToNextApp);

如上所述,使用读卡器时我得到的结果是不一致的 . 似乎来自(GetKeyboardState)的键盘状态并不完全正确 . 主要是,它有时会说SHIFT在它不应该被按下时被按下,反之亦然 . http://msdn.microsoft.com/en-us/library/windows/desktop/ms646299(v=vs.85).aspx

有谁知道为什么会这样,以及为什么它在记事本中正常工作?更重要的是,我如何解决/解决它?谢谢 .

1 回答

  • 4

    您正在使用一个低级别的键盘钩子,它在线程中运行 . 因此,当您调用 GetKeyboardState 时,您将获得自己的本地键盘的状态,而不是记事本键盘的状态 . 如果要沿此路线继续,则需要手动跟踪班次键状态 . 为什么不在您的应用程序中处理正常的键盘消息?为什么需要全局钩子?如果您正常处理它们,则会发生shift键处理,当您调用 GetKeyboardState 时,您将看到相应的键状态 . 将原始键盘活动转换为键入的字符是众所周知的困难 . 除了shift键状态之外,您还必须担心Caps Lock和IME .

相关问题