Уроки Iczelion'а



         

Урок 24. Windows-хуки - часть 7


invoke SetWindowsHookEx,WH_MOUSE,addr Mouseproc,hInstance,NULL mov hHook,eax ret InstallHook endp

UninstallHook proc invoke UnhookWindowsHookEx,hHook

ret UninstallHook endp

End DllEntry ;---------------------------------------------- ; Это makefile DLL ;----------------------------------------------

NAME=mousehook

$(N*ME).dll: $(NAME).obj Link /SECTION:.bss,S /DLL /DEF:$(NAME).def /SUBSYSTEM:WINDOWS /LIBpATH:c:\masm\lib $(NAME).obj $(NAME).obj: $(NAME).asm

ml /c /coff /Cp $(NAME).asm

Анализ:

Пример отобразит диалоговое окно с тремя edit control'ами, которые будут заполнены именем класса, хэндлом окна и адресом процедуры окна, ассоциированное с окном под курсором мыши. Есть две кнопки - Hook и Exit. Когда вы нажимаете кнопку Hook, программа перехватывает сообщения от мыши и текст на кнопке меняется на Unhook. Когда вы двигаете курсор мыши над каким-либо окном, информация о нем отобразится в окне программы. Когда вы нажмете кнопку Unhook, программа уберет установленный hook.

Основная программа использует диалоговое окно в качестве основного. Она определяет специальное сообщение - WM_MOUSEHOOK, которая будет использоваться между основной программой и DLL с хуком. Когда основная программа получает это сообщение, wрaram содержит хэндл окна, над которым находится курсор мыши. Конечно, это было сделано произвольно. Я решил слать хэндл в wрaram, чтобы было проще. Вы можете выбрать другой метод взаимодействия между основной программой и DLL с хуком.

.if HookFlag==FALSE invoke InstallHook,hDlg .if eax!=NULL mov HookFlag,TRUE invoke SetDlgItemText,hDlg,IDC_HOOK,addr UnhookText .endif

Программа пользуется флагом, HookFlag, чтобы отслеживать соостояние хука.

Он pавна FALSE, если хук не установлен, и TRUE, если установлен.

Когда пользователь нажмет кнопку hook, программа проверяет, установлен ли уже хук. Если это так, она вызывает функцию InstallHook из DLL. Заметьте, что мы передаем хэндл основного диалогового окна в качестве параметра функции, чтобы хук-DLL могла посылать сообщения WM_MOUSEHOOK верному окну, то есть нашему.




Содержание  Назад  Вперед