глобальные зацепки клавиатуры в с - PullRequest
1 голос
/ 05 февраля 2012

Я хочу написать глобальный хук клавиатуры, чтобы запретить переключение задач. Когда я гуглил, я нашел много кодов в c #, cpp (и delphi), но мне нужны некоторые базовые понятия о перехвате (было бы лучше, если бы примерынаходятся в C). Так что, пожалуйста, предложите ресурсы, ссылки, которые могут помочь мне понять это с точки зрения C.

PS: я нашел один хороший рабочий пример (работает на winXP и старшеверсии), но когда я попытался скомпилировать код, он дает мне: enter image description here

И я попытался поиск констант "IDC_" во всех заголовках (по умолчанию, которые поставляются с установкой MinGW gcc и те, которые предоставляютсяразработчик), но не повезло ... Если кто-нибудь может скомпилировать код и запустить его, пожалуйста, помогите мне. Я не загружал сам исходный код здесь, так как есть несколько зависимостей заголовочного файла, и в этом случае я должен был бы опубликоватьвесь код здесь.

winXP - это целевая среда, но было бы лучше, если бы я также запустил Win7.

1 Ответ

9 голосов
/ 05 февраля 2012

Я выйду на передний план, предполагая, что вы работаете в Windows и хотите захватить глобальные нажатия клавиш. Способ сделать это - использовать LowLevelHooks. Посмотрите на следующий пример:

Определите эту функцию обратного вызова где-нибудь в вашем коде:

//The function that implements the key logging functionality
LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{
   char pressedKey;
   // Declare a pointer to the KBDLLHOOKSTRUCTdsad
   KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
   switch( wParam )
   {
       case WM_KEYUP: // When the key has been pressed and released
       {
          //get the key code
          pressedKey = (char)pKeyBoard->vkCode;
       }
       break;
       default:
           return CallNextHookEx( NULL, nCode, wParam, lParam );
       break;
   }

    //do something with the pressed key here
      ....

   //according to winapi all functions which implement a hook must return by calling next hook
   return CallNextHookEx( NULL, nCode, wParam, lParam);
}

И тогда где-нибудь внутри вашей основной функции вы бы установили хук следующим образом:

 //Retrieve the applications instance
 HINSTANCE instance = GetModuleHandle(NULL);
 //Set a global Windows Hook to capture keystrokes using the function declared above
 HHOOK test1 = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, instance,0);

Более общую информацию о крючках можно найти здесь . Вы также можете точно так же точно захватывать другие глобальные события, следуя указаниям, приведенным в документации SetWindowsHooksEX .

...