2012-02-05 5 views
1

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

PS: Я нашел один хороший working example (работает на WinXP и более ранних версий), но когда я попытался компиляции кода это дает мне: enter image description here

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

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

+1

На какой платформе вы намерены использовать это? WinXP? Если у Winapi есть способ реализовать глобальные клавиатурные перехватчики. – Lefteris

+0

Я забыл упомянуть об этом ... да, winXP - это целевая среда, но было бы лучше, если бы я запустил Win7. – buch11

+0

Вижу, ну в общем, мне нужно было посмотреть, находится ли он под Windows. Проверьте, может ли мой ответ ниже. – Lefteris

ответ

8

Я выйду на конечность, предполагая, что вы находитесь в 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); 

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