首页 文章

创建SendInput时调用全局低级键盘钩子 . 怎么预防呢?

提问于
浏览
3

我有一个用c编写的win 32应用程序,用于设置低级键盘钩子 . 现在我想sendInput到任何应用程序,如word / notepad . 我该怎么做呢?

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

因为SendInput适用于任何Windows应用程序,我想使用它 . 问题是我用按下的键调用了我的回调函数 .

例如我按了A,我想将U 0BAF unicode字符发送到活动的applciation窗口 . 在这种情况下,假设它是记事本 .

问题是我在记事本中得到两个字符U 0BAF和A.

正在发送A,因为我正在调用CallNextHookEx(NULL,nCode,wParam,lParam);

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

有什么建议吗?

1 回答

  • 3

    如果我正确理解您的问题,您应该忽略"injected"关键事件
    在你的钩子程序中像这样:

    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);
      }
      ...
    

    Update: 另外你必须吃字符并通知其他一些例程
    对于角色按下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_KEYDOWN

    ie, #define WM_MY_KEYDOWN (WM_USER + 1)
    

    并调用将生成新密钥事件的相应例程 .

相关问题