Я изучаю C / C ++ и недавно создал key-logger, главным образом потому, что это простой проект для обучения. Так что я бегу GetAsynKeyState()
в цикле, чтобы проверить состояние ключа. Когда я проверяю процессор, его циклы резко возрастают; Я постоянно запускаю цикл с условным в нем.
Мне кажется, что делать подобные вещи расточительно, я уверен, что более продвинутые программы не используют такую технику.
Вопрос: Когда клавиша нажата, для обработки ядра создается прерывание. Может ли моя программа «разбудить», как ядро, или единственное решение постоянно проверять нажатую клавишу? Что будет делать профессиональное приложение?
Кроме того, языки программирования реализуют прослушиватель событий, как они выполняют это, опрос или какое-то другое волшебство?
Хук — это механизм для перехвата событий (например, действий мыши или нажатия клавиш) до того, как они достигают приложения. Функции, которые получают эти события, называются функциями фильтра (см. MyKbHook
ниже. ) Для вызова функции фильтра необходимо подключить к хуку Windows (см. SetWindowHookEx
ниже).
Если к хуку подключено более одной функции фильтра, Windows поддерживает цепочку функций фильтра. Последняя установленная функция находится в начале цепочки, а первая установленная функция — в конце.
LRESULT CALLBACK MyKbHook( int nId, WPARAM wParam, LPARAM lParam )
{
char keyPressed;
KBDLLHOOKSTRUCT *pHook = (KBDLLHOOKSTRUCT *)lParam;
switch( wParam )
{
case WM_KEYUP:
{
//get the key code
keyPressed= (char)pHook->vkCode;
}
break;
default:
return CallNextHookEx( NULL, nId, wParam, lParam );
break;
}//Each function implementing a hook must call the next hook in chain before return
return CallNextHookEx( NULL, nId, wParam, lParam);
}// somewhere in your code where you want start tracking
HHOOK hookKB = SetWindowHookEx(WH_KEYBOARD,(HOOKPROC)MyKbHook,hInst,0);
// when you do not need it anymore you SHOULD uninstall it
UnhookWindowsHookEx(hookKB);
Профессиональный метод зависит от ОС к ОС. В Windows вы просто используете сообщения Windows. В зависимости от ваших потребностей, вы обычно используете WM_CHAR
или же WM_KEYDOWN
, Намного проще, чем крючки.