首页 文章

低级键盘钩:未达到回调

提问于
浏览
1

我正在尝试创建一段快速代码来捕获平板电脑上的一个“热键”按钮发送的按键序列并重新编程其功能 . 按下时,按钮会发送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 回答

  • 3

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

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

    MSG msg;
       while( GetMessage( &msg, NULL, 0, 0 ) != 0 ) 
       {
          TranslateMessage( &msg );
          DispatchMessage( &msg );
    
          if(gotKey) 
            printf("Got Key!\n");        
    
          gotKey = FALSE;
       }
    

相关问题