C ++ SetWindowsHookEx WH_KEYBOARD_LL Правильная установка - PullRequest
5 голосов
/ 30 января 2010

Я создаю консольное приложение, в котором я хотел бы записывать нажатия клавиш (например, СТРЕЛКА ВВЕРХ). Я создал низкоуровневую клавиатуру, которая должна захватывать все нажатия клавиш в любом потоке и вызывать мою функцию обратного вызова, но она не работает. Программа немного останавливается, когда я нажимаю клавишу, но никогда не вызывает обратный вызов. Я проверил документацию, но ничего не нашел. Я не знаю, неправильно ли я использую SetWindowsHookEx () (насколько мне известно, он успешно создает ловушку) или моя функция обратного вызова неверна! Я не уверен, что не так! Заранее спасибо за помощь.

#include "Windows.h"
#include <iostream>
using namespace std;

HHOOK hookHandle;

LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam);

int _tmain(int argc, _TCHAR* argv[]) {

 hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0);

 if(hookHandle == NULL) {
  cout << "ERROR CREATING HOOK: ";
  cout << GetLastError() << endl;
  getchar();
  return 0;
 }

 MSG message;

 while(GetMessage(&message, NULL, 0, 0) != 0) {
  TranslateMessage( &message );
  DispatchMessage( &message );
 }

 cout << "Press any key to quit...";
 getchar();

 UnhookWindowsHookEx(hookHandle);

 return 0;
}


LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam) {
 cout << "Hello!" << endl;

 // Checks whether params contain action about keystroke
 if(nCode == HC_ACTION) {
  cout << ((KBDLLHOOKSTRUCT *) lParam)->vkCode << endl;
 }

 return CallNextHookEx(hookHandle, nCode, 
            wParam, lParam);
}

Ответы [ 3 ]

2 голосов
/ 30 января 2010

Вы не можете заблокировать системный вызов (getchar), вы должны запустить цикл окна и обрабатывать сообщения, прежде чем вызов будет перехвачен.

0 голосов
/ 26 октября 2014

Я предлагаю сначала simle;

// VB: получить экземпляр приложения HINSTANCE appInstance = GetModuleHandle (NULL);

и затем: hookHandle = SetWindowsHookEx (WH_KEYBOARD_LL, keyHandler, appInstance, 0);

// ..., но позже появляются и другие ошибки

0 голосов
/ 22 февраля 2014

В Windows XP вам нужно передать hInstance (из WinMain) в качестве третьего аргумента SetWindowsHookEx. Например:

int WINAPI WinMain
( HINSTANCE hInstance, HINSTANCE hPrevInstance,
  LPTSTR lpCmdLine, int nCmdShow ) {

  hookHandle = SetWindowsHookEx ( WH_KEYBOARD_LL, keyHandler, hInstance, 0 );

// ...
...