【问题标题】:Low Level keyboard hook never catches WM_KEYDOWN低级键盘钩子永远不会捕获 WM_KEYDOWN
【发布时间】:2013-08-10 17:52:24
【问题描述】:

我正在尝试创建宏应用程序,该应用程序将在按下键时开始运行某些操作(系统范围的快捷方式)。我确实使用 Visual Studio 2012 创建了 Windows 窗体应用程序。加载表单时,安装了键盘钩子:

HookHandle = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC)keyboardHookHandler, GetModuleHandle(NULL), NULL);
if( HookHandle == 0){
    MessageBox::Show("Error setting hook!");
}

我的钩子回调函数是:

public: static LRESULT CALLBACK keyboardHookHandler( int code, WPARAM wParam, LPARAM lParam ) {
    if(code>=0 && wParam == WM_KEYDOWN){
        MessageBox::Show("Key Down");
    }
    return CallNextHookEx( HookHandle, code, wParam, lParam); 
}

当我编译应用程序并运行它时,消息框永远不会显示。更要说的是,我知道这个回调函数已被触发,但 wParam 始终包含值 45(我确实检查过,应该返回的那些 WM 常量都没有值 45)。同样在几个关键事件之后应用程序崩溃。

这段代码不能正常工作的原因是什么?

更新: 我确实将强制转换为 HOOKPROC 并将其更改为委托过程:

private: 
    delegate LRESULT CALLBACK HOOKPROC( int code, WPARAM wParam, LPARAM lParam );
    HOOKPROC^ keyboardHookProcedure;

挂钩设置为:

keyboardHookProcedure = gcnew HOOKPROC(this, &MyForm::keyboardHookHandler);
HookHandle = SetWindowsHookEx( WH_KEYBOARD_LL, keyboardHookProcedure, GetModuleHandle(NULL), NULL);

但现在我有这个问题:

错误 C2664:“SetWindowsHookExW”:无法将参数 2 从“WindowsFormTest::MyForm::HOOKPROC ^”转换为“HOOKPROC”

【问题讨论】:

  • public: static ... 你来自 Java,对吧? ;)
  • 全局挂钩要求您的挂钩过程在 .dll 中实现。您对SetWindowsHookEx 的调用传递了启动进程的可执行映像的HINSTANCE (GetModuleHandle(NULL))。在调试您的应用程序时,VS 的调试器可以将消息标识符转换为人类可读的形式。使用附加 ,wm 格式说明符的相应符号设置手表,例如 wParam,wm
  • 它是一个低级挂钩,因此它不应该需要 DLL。我只使用 Windows Api(简单的简单窗口)在 NetBeans 中完成了它。回调过程中的 STATIC 有什么问题?需要通过程序才能挂钩。还是我错了?
  • 您不需要强制转换回调函数。 CallNextHookEx 的第一个参数应该是 nullptr。除此之外,也许你错过了钩子调用的主要抽水。
  • 您正在编写 C++/CLI 代码,而不是 C++ 代码。您将需要摆脱 (HOOKPROC) 强制转换,这只会阻止编译器告诉您您做错了。删除强制转换时从编译器收到的错误消息会告诉您问题所在。

标签: c++ winforms winapi visual-studio-2012


【解决方案1】:

如果您想在全局范围内捕获唯一的组合键,使用RegisterHotKey 可能会更简单。它定义了一个系统范围的热键,不需要钩子或任何特殊的东西。它将覆盖前台进程处理,因此如果您尝试注册公共键组合,这将不是理想的选择。

【讨论】:

  • 如果我在这之后不做鼠标钩子就可以解决我的问题了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
相关资源
最近更新 更多