【问题标题】:SHIFT key is incorrectly detected in keyboard state when using Windows keyboard hook使用 Windows 键盘挂钩时,在键盘状态下错误地检测到 SHIFT 键
【发布时间】:2012-08-06 13:47:23
【问题描述】:

我正在使用磁卡读卡器。

当插入 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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。该应用程序作为具有多个应用程序的信息亭运行,我们希望检测所有按键(或阅读器输入),因此挂钩。手动检测 SHIFT 似乎可以解决问题。
    • 幸运的是,这是一个您可以控制键盘并确保它是美式英语的信息亭。其他语言的转换状态要困难得多。 (请注意,即使是美式英语,您也需要担心 Caps Lock、Ctrl、Alt 和 Num Lock。)
    • 只需使用 GetAsyncKeyState。它将正确检索修饰键(shift、control、alt)的值,而不管哪个窗口处于活动状态。 GetKeyboardState 无法通过线程问题检索它们。另一方面,GetAsyncKeyState 获取键的物理属性,因此它不会返回 Caps、Num 和 Scroll 的切换状态。使用 GetAsyncKeyState(填充字节数组)遍历所有键后,调用 GetKeyState 获取 caps、scroll 和 num lock,并检查它们的切换位(最低有效位),并覆盖主数组中的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多