【问题标题】:Window Not Receiving WM_KEYDOWN/WM_KEYUP Events窗口未接收 WM_KEYDOWN/WM_KEYUP 事件
【发布时间】:2015-03-23 15:18:09
【问题描述】:

我通过 SetWindowHookExA(从 DLL 注入)连接到另一个进程主窗口并附加到 WH_KEYBOARD 事件。但是,我的回调从未被调用,但挂钩成功,我得到了原始值作为回报。

在使用 Spy++ 进行调查后,窗口似乎根本没有收到任何 WM_KEYUP / WM_KEYDOWN 等消息。使用调试器进一步挖掘我可以确认窗口消息正在由 PeekMessage / TranslateMessage / DispatchMessage 处理,因此根据基于 PeekMessage 的 MSDN,事件应该正常发生。然而,它们似乎从未发生过。

有什么东西可以让创建的窗口阻止这些消息发生在他们的窗口中吗? (我也尝试通过 SetWindowLongPtr 连接到 WNDPROC,但仍然不行,我的回调可以正常接收所有消息,但 WM_KEY* 消息永远不会发生。)

该应用程序确实使用了 DirectInput,但是在其他使用 DirectInput 的先前项目中,键盘消息仍然正常发生。

简单回顾一下我的尝试等:

  • 使用 WH_KEYBOARD 设置 WindowsHookExA;从未调用过回调。
  • SetWindowLongPtr 与 GWL_WNDPROC;通话被击中,永远不会看到键盘消息。
  • 已确认的窗口确实使用 PeekMessage 来处理其消息,因此键盘消息应该会正常发生。

【问题讨论】:

  • 它可能使用原始输入。
  • 窗口是否获得输入焦点?
  • 是的,焦点发生了。鼠标完全可以正常工作。用 WH_MOUSE 钩住鼠标工作正常,消息按预期处理。窗口可以聚焦等没问题。所以我看不到窗口没有正确聚焦以进行输入的任何地方。
  • 别人安装了全局键盘钩子,调用CallNextHookEx失败。在这种情况下,键盘输入仍然可以到达目标窗口,但链中的所有其他钩子都没有机会看到它。
  • 没有安装其他任何钩子。我有钩子来防止在我之后应用任何其他钩子,甚至没有尝试创建。

标签: c++ windows winapi windows-messages


【解决方案1】:

我只是连接到 DirectInput 并通过它创建我需要的键盘处理东西。这不是我想做的事情,但最终结果可以按需要进行。

【讨论】:

    【解决方案2】:

    MSDN 说您确实可以在消息到达您的 WNDPROC 之前对其进行过滤。看看this page。您可能不得不挂接到堆栈中更高的位置,或者只是重新考虑您的方法。

    【讨论】:

    • 查看他们如何称呼事物,似乎没有发生任何过滤。他们使用几乎所有空参数调用 PeekMessage,除了在调用时删除消息。所以从表面上看,他们根本没有过滤掉结果消息。
    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2016-01-11
    相关资源
    最近更新 更多