hook перехват нажатия клавиш

Тема в разделе "WASM.BEGINNERS", создана пользователем JacK3, 20 апр 2009.

  1. JacK3

    JacK3 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    12
    Сразу говорю, я полный нубас, прошу не пинать!
    Задача в следуюущем, мне нужно перехватывать нажатие клавиш и выводить нажатую кнопку в меседж боксе...
    Пишу дллку
    Основная функция хука:
    Код (Text):
    1. HookKeyProc proc nCode0: DWORD, wParam0: DWORD, lParam0: DWORD
    2. invoke CallNextHookEx, Hook2 ,nCode0, wParam0, lParam0;
    3. invoke MessageBox,NULL,addr wParam0,addr PressMsg,MB_OK
    4. ret
    5. HookKeyProc endp
    Тут помоему, всё понятно...

    Исполняемый:
    Код (Text):
    1. .code
    2. start:
    3. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    4.     invoke LoadLibrary,addr LibName; грузим нашу длл
    5.         mov dll0,eax
    6.         .if eax==NULL ; обработка ошибки
    7.          invoke MessageBox,NULL,addr DllNotFound,addr FunctionName,MB_OK
    8.         .endif
    9.         ; если длл найдена
    10.         invoke GetProcAddress, dll0, addr FunctionName ; Получаем адрес процедуры обработки по имени процедуры
    11.         mov dll1,eax
    12.        
    13. invoke SetWindowsHookEx, WH_KEYBOARD, dll1, dll0, 0 ; ставим хук
    14. xor eax,eax
    15. ret
    16. WndProc endp
    17. end start
    Проблема в том, что программа, как только я ставлю хук уже завершается и выгружает мою дллку...Как правильно её зациклить?
    Но это фигня кое как кривенько работает, поскольку я сую меседжбокс при DLL_PROCESS_DETACH, и программа не успевает завершится)) Ну... тоесть у меня вылетает меседжбокс, и пока его не закроешь хук работает...
    Но тут возникает вторая проблемма. Почему, когда я нажимаю какую нибудь клавишу меседжбокс вылетает несколько раз?

    Вот для полной ясности кидаю сорцы и бинарники этой бредятины)))
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    JacK3
    > Как правильно её зациклить?
    Зависит от трактовки слова "правильно".
    Например, Рихтер, после SetWindowsHookEx вызывает MessageBox, пока он висит - программа не закрывается.

    > Почему, когда я нажимаю какую нибудь клавишу меседжбокс вылетает несколько раз?
    Ознакомься с первым абзацем msdn: KeyboardProc Function. Если понятней не станет, то возвращайся.
     
  3. rdtsc

    rdtsc Параллелепипедов Артем

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    180
    Адрес:
    Москва
    Если не ошибаюсь глобальный хук на то и глобалтьный что его код проецируется в адрес простарства разных процессов в которых осуществляется ввод с клавы. И когда процесс за которым следят завершается - вызывается детач и поэтому неск раз твоя месаг бокса работает.
     
  4. JacK3

    JacK3 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    12
    1. q_q За первый абзац спасибо. Понял, что хук вызывается когда кнопка нажимается и отжимается, так? А как тогда выключить обрабатывание отжатия клавиши? Потому что мне нужен только один маседж бокс))
    2. rdtsc Ну да, фишка в том, что когда ты переключаешься между окнами и нажимаешь кнопку, дллка проецируется в этот новый процесс и снова вылетает аттач и деаттач... Так и задумано))
     
  5. JacK3

    JacK3 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    12
    Вот туплю...
    Если кто не догадался, то нужно обработать событие нажатие клавиши этот параметр находится в lParam
    Код (Text):
    1. HookKeyProc proc nCode0: DWORD, wParam0: DWORD, lParam0: DWORD
    2. .IF nCode0 == HC_ACTION
    3. mov eax, lParam0
    4. shr eax,16
    5. and eax, KF_UP
    6. .IF (eax == 0)
    7. invoke MessageBox,NULL,addr wParam0,addr PressMsg,MB_OK
    8. .ENDIF
    9. .ENDIF
    10. invoke CallNextHookEx, Hook2 ,nCode0, wParam0, lParam0;
    11. ret
    12. HookKeyProc endp
    Вот это правильно работает)
     
  6. JacK3

    JacK3 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    12
    И ещё вопрос... Извините, не по теме!
    У меня стоит оутпост 4 (Новую версию ставить лень)
    Так вот когда я хукаю доверенное приложение и пытаюсь лезть в интернет например, - он не реагирует.
    Кроме того когда хукаю сам оутпост он виснет, пока не выгружу dll.
    Может у меня настройки безопасности не правильные?