低级键盘钩子:回调未到达
Low-level keyboard hook: callback not reached
我正在尝试创建一个快速的代码片段,以捕获由我的平板电脑上的一个"热键"按钮发送的键序列,并重新编程其功能。该按钮在按下时发送LWin+LCtrl+Tab。
在搜索了一段时间后,我决定尝试使用WH_KEYBOARD_LL钩子,但几个小时后,我仍然无法让钩子工作,更不用说实际的功能了。
目前,我有以下内容:
// TestHook2.cpp
#include "stdafx.h"
HHOOK hook;
BOOL gotKey;
LRESULT WINAPI KeyTrap(int, WPARAM, LPARAM);
BOOL CtrlHandler(DWORD);
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
HMODULE currentProcess = GetModuleHandle(NULL);
hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyTrap, currentProcess, 0);
if (!hook) {
printf("No hook, quitting!n");
return 1;
}
while(1) {
if(gotKey) printf("Got Key!n");
gotKey = FALSE;
}
return 0;
}
LRESULT CALLBACK KeyTrap(int nCode, WPARAM wParam, LPARAM lParam)
{
gotKey = TRUE;
return CallNextHookEx(hook, nCode, wParam, lParam);
}
BOOL CtrlHandler(DWORD fdwCtrlType)
{
if (fdwCtrlType == CTRL_C_EVENT)
{
printf("Got CTRL+C, unhooking...n");
UnhookWindowsHookEx(hook);
}
return FALSE;
}
SetWindowsHookEx返回的句柄绝对不是NULL,但由于某种原因,KeyTrap根本不会被调用,无论我尝试按多少个键。我也试图把回调在DLL和使用LoadLibrary运行时,但这也给出了完全相同的结果。
我是Win32编程的新手,所以这很可能是一个非常愚蠢的错误。
非常感谢!
(PS:代码在Win7上运行。目前还没有真正的键盘,但我试过用屏幕上的键盘、远程(RDP)输入和平板电脑上的硬件热键来生成按键。这是问题吗?)
问题是你的控制台应用程序没有一个消息循环来处理钩子消息。
将您的while(1)
循环替换为以下内容,看看是否有效:
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) != 0 )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
if(gotKey)
printf("Got Key!n");
gotKey = FALSE;
}
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- OpenCV 为键盘事件设置回调
- 处理键盘输入的回调
- 低级键盘钩子:回调未到达
- 如何多线程glfw键盘回调