我正在尝试创建一段快速代码来捕获平板电脑上的一个“热键”按钮发送的按键序列并重新编程其功能 . 按下时,按钮会发送LWin LCtrl标签 .
经过一段时间的搜索,我决定尝试使用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)输入和平板电脑上的硬件热键生成击键 . 这可能是问题吗? )
1 回答
问题是您的控制台应用程序没有消息循环来处理挂钩消息 .
用以下内容替换
while(1)
循环,看看是否有效: