低级键盘钩永远不会捕获WM_KEYDOWN

时间:2013-08-10 17:52:25

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

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

1 个答案:

答案 0 :(得分:0)

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