我正在尝试创建一个宏应用程序,它将在按下键时开始运行某些操作(系统范围的快捷方式)。我确实使用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'
答案 0 :(得分:0)
如果您尝试全局捕获唯一键组合,则使用RegisterHotKey可能更简单。它定义了一个系统范围的热键,不需要钩子或任何特殊的东西。它将覆盖前台进程处理,因此如果您尝试注册公共密钥组合,这将不是理想的。