Крючок клавиатуры низкого уровня: обратный вызов не достигнут - PullRequest
1 голос
/ 19 июля 2011

Я пытаюсь создать быстрый фрагмент кода, чтобы зафиксировать последовательность клавиш, отправленных одной из кнопок «горячих клавиш» на моем планшете, и перепрограммировать ее функцию.Кнопка отправляет 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 Ответ

3 голосов
/ 19 июля 2011

Проблема в том, что в вашем консольном приложении нет цикла обработки сообщений для перехвата сообщений.

Замените ваш while(1) цикл следующим и посмотрите, работает ли он:

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

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

      gotKey = FALSE;
   }
...