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

有谁知道为什么会发生这种情况以及为什么它在记事本中正常工作?更重要的是,我如何修复/解决它?谢谢你。

4

1 回答 1

4

您正在使用线程内运行的低级键盘挂钩。因此,当你打电话时,GetKeyboardState你得到的是你自己本地键盘的状态,而不是记事本键盘的状态。如果您想沿着这条路线继续前进,您需要手动跟踪 shift 键的状态。为什么不在你的应用程序中处理普通的键盘消息?为什么需要全局挂钩?如果您正常处理它们,则将发生 shift 键处理,并且当您调用时,GetKeyboardState您将看到适当的键状态。将原始键盘活动转换为键入的字符非常困难。除了转换键状态之外,您还必须担心 Caps Lock 和 IME。

于 2012-08-06T13:56:42.767 回答