Доброго времени суток! Пишу консольное приложение на на С++. Возникла необходимость перехватиывать низкоуровневые сообщения клавиатуры, для чего пытаюсь поставить хук WH_KEYBOARD_LL. Код следующий Код (Text): #include "stdafx.h" #include "windows.h" #include "conio.h" HHOOK hHook; LRESULT CALLBACK KeyLLProc(int nCode, WPARAM wParam, LPARAM lParam) { Beep(4000,10); return CallNextHookEx(hHook,nCode,wParam,lParam); } int _tmain(int argc, _TCHAR* argv[]) { hHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyLLProc,GetModuleHandle(NULL),0); if(hHook==NULL) { int err=GetLastError(); printf("ERROR=%d",err); getch(); return 0; } getch(); UnhookWindowsHookEx(hHook); return 0; } По моим представлениям, оно должно бикать каждый раз, когда я нажимаю кнопку. Тем не менее, реакция на выполнение программы следующая: при каждом нажатии на клавишу, например в блокноте, соответствующая буква появляется с некоторой задержкой (около секунды), но никаких бипов. Уже который день пытаюсь разобраться, что не так. Перечитал кучу статей и форумов. Может кто-нибудь знает в чем беда? Запускаю под xp sp3
Верно, нужно через Message Loop. [ while GetMessage() {DispatchMessage();} ] А задержка перед выводом символа – это, видимо, LowLevelHook Timeout: твой поток ждёт ввода в консоль через getch() и не может переключиться на выполнение хук-процедуры. Кстати, позже будет необходимость убедиться, что Beep() сам по себе срабатывает. Возможно, лучше в консоль что-нибудь вывести или даже файл создать. Или точку слома на начало функции поставить. Btw, утверждение "CallNextHookEx первым параметром должна принимать HHOOK" не держит правду уже очень давно (HHOOK игнорируется, ага). (Сюрприз: это всё документировано в msdn).
Пасиб, действительно с месадж лупом все заработало) я пока пробовал разные варианты, убедился во всем) бип, работает причины задержек я такие и подозревал. а про CallNextHookEx это да, я уже потом сам в мсдн посмотрел, но для порядку все равно делаю так