低级键盘挂钩从未捕获WM_KEYDOWN
Low Level keyboard hook never catches WM_KEYDOWN
我正在尝试创建宏应用程序,该应用程序将在按键时开始运行某些操作(系统范围的快捷方式)。我确实使用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)。同样在一些关键事件之后,应用程序崩溃。
这段代码不能正常工作的原因是什么
更新:我确实移除了HOOKROC的石膏,并将其改为委托程序:
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"
如果您试图在全局范围内捕获唯一的密钥组合,那么使用RegisterHotKey可能会更简单。它定义了一个系统范围的热键,不需要钩子或任何特殊的东西。它将覆盖前台进程处理,所以如果你试图注册一个公共键组合,这将不是理想的。
相关文章:
- "WM" C++是什么意思?
- 什么是窗口最大化/最小化/恢复的WM Windows消息
- 请求X11在C或C++中合成WM的图像
- SDL 2 Space keydown未检测到,但Space keyup工作正常
- 删除密钥未触发 KeyUp 和 KeyDown 事件
- C++(煤渣):无法在 keyDown 函数中更新对象的属性
- Visual C++ Forms: Global Keydown
- 如何在C++中将keydown事件发送到非活动窗口
- 如果在WM/CE平台中用于卸载,DMProcessConfigXML将关闭正在运行的应用程序
- 在C或c++ (mac OSX)中有KeyDown事件
- 模拟跳跃与keyDown过剩c++不是100%
- VB.NET:未知的KeyDown事件问题
- UWP Windows 10 Direct3D 12 应用程序C++ KeyDown 延迟