我正在尝试创建宏应用程序,该应用程序将在按下键时开始运行某些操作(系统范围的快捷方式)。我确实使用 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”