我正在使用磁卡读卡器。
当插入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
有谁知道为什么会这样,为什么它在记事本中正常工作?更重要的是,我如何解决/解决它?谢谢。
答案 0 :(得分:4)
您正在使用一个低级别的键盘钩子,它在线程中运行。因此,当您调用GetKeyboardState
时,您将获得自己本地键盘的状态,而不是记事本键盘的状态。如果要沿此路线继续,则需要手动跟踪班次键状态。为什么不在您的应用程序中处理正常的键盘消息?你为什么需要一个全局钩子?如果您正常处理它们,则会发生shift键处理,当您调用GetKeyboardState
时,您将看到相应的键状态。将原始键盘活动转换为键入的字符是众所周知的困难。除了shift键状态之外,您还必须担心Caps Lock和IME。