Вопрос по принцыпу работы перехвата события из dll (hook из dll)

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

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Вот у меня каркас рабочей стандартной dll- ки локального
    хука на нажатие клавиши. Найденный где-то на форуме wasm-a.
    Код (Text):
    1. ...
    2. .data
    3.     hInstance   dd 0
    4. .data?
    5.     hHook   dd ?
    6.     hWnd    dd ?
    7. .code
    8. DllEntry proc hInst:DWORD, reason:DWORD, reserved1:DWORD
    9.     .if reason==DLL_PROCESS_ATTACH
    10.         push    hInst
    11.         pop hInstance                     ;<---hInstance
    12.     .endif
    13.     mov  eax,TRUE
    14.     ret
    15. DllEntry Endp
    16.  
    17. KeyProc proc nCode:DWORD, wParam:DWORD, lParam:DWORD
    18.     invoke  CallNextHookEx, hHook, nCode, wParam, lParam
    19.     ; something todo
    20.     xor eax, eax
    21.     ret
    22. KeyProc endp
    23. ; если hwnd - не ноль, то хук устанавливается, иначе - снимается ранее установленный хук
    24. Hook proc hwnd:DWORD
    25.     mov eax, hwnd
    26.     .if eax
    27.         mov hWnd, eax
    28.         lea eax, KeyProc
    29.         invoke  SetWindowsHookEx, WH_KEYBOARD, eax, hInstance, 0   ;<---hInstance
    30.         mov hHook, eax
    31.     .else
    32.         invoke  UnhookWindowsHookEx,hHook
    33.     .endif
    34.     ret
    35. Hook endp
    36. End DllEntry
    Вопрос: - объясните пожалуйста механизм запуска процедуры Hook()!
    Не понимаю как она запускается, ведь в DllEntry() нет ничего подобного
    invoke Hook, но все работает!?
    Спасибо.
     
  2. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Если вкратце - вы вызываете подпрограмму Hook с параметром в eax (там должен быть handle окна)
    Если при этом значение регистра eax не равно нулю, то hook устанавливается
    если же eax равен нулю, то, как и следовало ожидать, hook удаляется из цепочки hook'ов.

    Когда вы нажимаете клавишу, то вызывается подрпограмма KeyProc, зарегистрированная
    в качестве обработчика нажатия клавиши.
     
  3. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    вот пример исполозования hook'ов (отлавливаются передвижения мыши. взято с сайта).
    http://slil.ru/27807279
     
  4. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Microedition
    Спасибо.
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Эту процедуру вызывает система. Вы лишь решистрируете указатель на функцию обрабатывающее определённое событие..., система же при возникновении данного события вызывает зарегистрированные функции сама, тем самым уведомляя программу о оном.
    Говоря СИ-Языком это CALLBACK или по-русски: Процедура обратного вызова.
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Пардон. Предыдущий посто фтопку.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Если не сложно протестите пожалусто код, желательно на висте.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Отлично, значит работает. Фтопку хуки.