低级键盘钩子:回调未到达



我正在尝试创建一个快速的代码片段,以捕获由我的平板电脑上的一个"热键"按钮发送的键序列,并重新编程其功能。该按钮在按下时发送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;
   }

最新更新