Вот у меня каркас рабочей стандартной dll- ки локального хука на нажатие клавиши. Найденный где-то на форуме wasm-a. Код (Text): ... .data hInstance dd 0 .data? hHook dd ? hWnd dd ? .code DllEntry proc hInst:DWORD, reason:DWORD, reserved1:DWORD .if reason==DLL_PROCESS_ATTACH push hInst pop hInstance ;<---hInstance .endif mov eax,TRUE ret DllEntry Endp KeyProc proc nCode:DWORD, wParam:DWORD, lParam:DWORD invoke CallNextHookEx, hHook, nCode, wParam, lParam ; something todo xor eax, eax ret KeyProc endp ; если hwnd - не ноль, то хук устанавливается, иначе - снимается ранее установленный хук Hook proc hwnd:DWORD mov eax, hwnd .if eax mov hWnd, eax lea eax, KeyProc invoke SetWindowsHookEx, WH_KEYBOARD, eax, hInstance, 0 ;<---hInstance mov hHook, eax .else invoke UnhookWindowsHookEx,hHook .endif ret Hook endp End DllEntry Вопрос: - объясните пожалуйста механизм запуска процедуры Hook()! Не понимаю как она запускается, ведь в DllEntry() нет ничего подобного invoke Hook, но все работает!? Спасибо.
Если вкратце - вы вызываете подпрограмму Hook с параметром в eax (там должен быть handle окна) Если при этом значение регистра eax не равно нулю, то hook устанавливается если же eax равен нулю, то, как и следовало ожидать, hook удаляется из цепочки hook'ов. Когда вы нажимаете клавишу, то вызывается подрпограмма KeyProc, зарегистрированная в качестве обработчика нажатия клавиши.
вот пример исполозования hook'ов (отлавливаются передвижения мыши. взято с сайта). http://slil.ru/27807279
Эту процедуру вызывает система. Вы лишь решистрируете указатель на функцию обрабатывающее определённое событие..., система же при возникновении данного события вызывает зарегистрированные функции сама, тем самым уведомляя программу о оном. Говоря СИ-Языком это CALLBACK или по-русски: Процедура обратного вызова.