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

时间:2012-08-06 13:47:24

标签: c# winapi keyboard-hook magnetic-cards cardreader

我正在使用磁卡读卡器。

当插入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 个答案:

答案 0 :(得分:4)

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