低级键盘钩:未达到回调

时间:2011-07-18 23:41:37

标签: c++ winapi keyboard-hook

我正在尝试创建一段快速代码来捕获平板电脑上的一个“热键”按钮发送的按键序列并重新编程其功能。按下时按钮会发送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)输入和平板电脑上的硬件热键生成击键。这可能是问题?)

1 个答案:

答案 0 :(得分:3)

问题是您的控制台应用程序没有消息循环来处理挂钩消息。

用以下内容替换while(1)循环,看看是否有效:

   MSG msg;
   while( GetMessage( &msg, NULL, 0, 0 ) != 0 ) 
   {
      TranslateMessage( &msg );
      DispatchMessage( &msg );

      if(gotKey) 
        printf("Got Key!\n");        

      gotKey = FALSE;
   }