не устанавливается хук WH_KEYBOARD_LL

Тема в разделе "WASM.BEGINNERS", создана пользователем Lumen, 17 июл 2009.

  1. Lumen

    Lumen New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    5
    Доброго времени суток! Пишу консольное приложение на на С++. Возникла необходимость перехватиывать низкоуровневые сообщения клавиатуры, для чего пытаюсь поставить хук WH_KEYBOARD_LL.
    Код следующий
    Код (Text):
    1. #include "stdafx.h"
    2. #include "windows.h"
    3. #include "conio.h"
    4.  
    5. HHOOK hHook;
    6.  
    7. LRESULT CALLBACK KeyLLProc(int nCode, WPARAM wParam, LPARAM lParam)
    8. {
    9.     Beep(4000,10);
    10.     return CallNextHookEx(hHook,nCode,wParam,lParam);
    11. }
    12.  
    13. int _tmain(int argc, _TCHAR* argv[])
    14. {
    15.  
    16.     hHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyLLProc,GetModuleHandle(NULL),0);
    17.     if(hHook==NULL)
    18.     {
    19.         int err=GetLastError();
    20.         printf("ERROR=%d",err);
    21.         getch();
    22.         return 0;
    23.     }
    24.     getch();
    25.     UnhookWindowsHookEx(hHook);
    26.     return 0;
    27. }
    По моим представлениям, оно должно бикать каждый раз, когда я нажимаю кнопку. Тем не менее, реакция на выполнение программы следующая: при каждом нажатии на клавишу, например в блокноте, соответствующая буква появляется с некоторой задержкой (около секунды), но никаких бипов. Уже который день пытаюсь разобраться, что не так. Перечитал кучу статей и форумов.

    Может кто-нибудь знает в чем беда?

    Запускаю под xp sp3
     
  2. Lumen

    Lumen New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    5
    Подумалось, может неправильно ожидать срабатывания хука с помощью getch()? а как тогда?
     
  3. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Верно, нужно через Message Loop. [ while GetMessage() {DispatchMessage();} ]
    А задержка перед выводом символа – это, видимо, LowLevelHook Timeout: твой поток ждёт ввода в консоль через getch() и не может переключиться на выполнение хук-процедуры.
    Кстати, позже будет необходимость убедиться, что Beep() сам по себе срабатывает. Возможно, лучше в консоль что-нибудь вывести или даже файл создать. Или точку слома на начало функции поставить.

    Btw, утверждение "CallNextHookEx первым параметром должна принимать HHOOK" не держит правду уже очень давно (HHOOK игнорируется, ага).

    (Сюрприз: это всё документировано в msdn).
     
  4. Lumen

    Lumen New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    5
    Пасиб, действительно с месадж лупом все заработало)

    я пока пробовал разные варианты, убедился во всем) бип, работает
    причины задержек я такие и подозревал.
    а про CallNextHookEx это да, я уже потом сам в мсдн посмотрел, но для порядку все равно делаю так:)