代码之家  ›  专栏  ›  技术社区  ›  coder

发送输入时调用全局低级键盘挂钩。如何预防?

  •  3
  • coder  · 技术社区  · 15 年前

    我有一个32的应用程序写在C++中,它设置了低级键盘钩子。现在我想将输入发送到任何应用程序,如Word/记事本。我该怎么做?

    我已经做够了使用findwindow/sendmessage。对于所有这些,我需要知道编辑控件。查找编辑控件非常困难。

    因为sendInput适用于任何Windows应用程序,所以我想使用它。问题是我有一个调用我的回调函数的按键。

    例如,我按下了A,我想将U+0BAF Unicode字符发送到活动应用程序窗口。在这种情况下,假设它是记事本。

    问题是我在记事本中有两个字符u+0baf和a。

    A正在发送,因为我正在调用callNexthookex(空、ncode、wparam、lparam);

    如果我在sendInput之后返回1,则没有任何内容发送到记事本。

    有什么建议吗?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Nick Dandoulakis    15 年前

    如果我正确理解了你的问题,你应该忽略“注入”的关键事件。
    在这样的钩子程序中:

    LRESULT CALLBACK
    hook_proc( int code, WPARAM wParam, LPARAM lParam )
    {
      KBDLLHOOKSTRUCT*  kbd = (KBDLLHOOKSTRUCT*)lParam;
    
      // Ignore injected events
      if (code < 0 || (kbd->flags & 0x10)) {
        return CallNextHookEx(kbdhook, code, wParam, lParam);
      }
      ...
    

    更新: 另外,你必须 并通知其他程序
    对于字符,请按Windows消息。

    例子:

    ...
    // Pseudocode
    if (kbd->vkCode is character) {
      if (WM_KEYDOWN == wParam) {
        PostMessage(mainwnd, WM_MY_KEYDOWN, kbd->vkCode, 0);
        return 1; // eat the char, ie 'a'
      }
    }
    return CallNextHookEx(kbdhook, code, wParam, lParam);
    

    在其他模块中,您可以处理wm_my_键

    ie, #define WM_MY_KEYDOWN (WM_USER + 1)
    

    并调用将生成新关键事件的适当例程。