Сразу говорю, я полный нубас, прошу не пинать! Задача в следуюущем, мне нужно перехватывать нажатие клавиш и выводить нажатую кнопку в меседж боксе... Пишу дллку Основная функция хука: Код (Text): HookKeyProc proc nCode0: DWORD, wParam0: DWORD, lParam0: DWORD invoke CallNextHookEx, Hook2 ,nCode0, wParam0, lParam0; invoke MessageBox,NULL,addr wParam0,addr PressMsg,MB_OK ret HookKeyProc endp Тут помоему, всё понятно... Исполняемый: Код (Text): .code start: WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM invoke LoadLibrary,addr LibName; грузим нашу длл mov dll0,eax .if eax==NULL ; обработка ошибки invoke MessageBox,NULL,addr DllNotFound,addr FunctionName,MB_OK .endif ; если длл найдена invoke GetProcAddress, dll0, addr FunctionName ; Получаем адрес процедуры обработки по имени процедуры mov dll1,eax invoke SetWindowsHookEx, WH_KEYBOARD, dll1, dll0, 0 ; ставим хук xor eax,eax ret WndProc endp end start Проблема в том, что программа, как только я ставлю хук уже завершается и выгружает мою дллку...Как правильно её зациклить? Но это фигня кое как кривенько работает, поскольку я сую меседжбокс при DLL_PROCESS_DETACH, и программа не успевает завершится)) Ну... тоесть у меня вылетает меседжбокс, и пока его не закроешь хук работает... Но тут возникает вторая проблемма. Почему, когда я нажимаю какую нибудь клавишу меседжбокс вылетает несколько раз? Вот для полной ясности кидаю сорцы и бинарники этой бредятины)))
JacK3 > Как правильно её зациклить? Зависит от трактовки слова "правильно". Например, Рихтер, после SetWindowsHookEx вызывает MessageBox, пока он висит - программа не закрывается. > Почему, когда я нажимаю какую нибудь клавишу меседжбокс вылетает несколько раз? Ознакомься с первым абзацем msdn: KeyboardProc Function. Если понятней не станет, то возвращайся.
Если не ошибаюсь глобальный хук на то и глобалтьный что его код проецируется в адрес простарства разных процессов в которых осуществляется ввод с клавы. И когда процесс за которым следят завершается - вызывается детач и поэтому неск раз твоя месаг бокса работает.
1. q_q За первый абзац спасибо. Понял, что хук вызывается когда кнопка нажимается и отжимается, так? А как тогда выключить обрабатывание отжатия клавиши? Потому что мне нужен только один маседж бокс)) 2. rdtsc Ну да, фишка в том, что когда ты переключаешься между окнами и нажимаешь кнопку, дллка проецируется в этот новый процесс и снова вылетает аттач и деаттач... Так и задумано))
Вот туплю... Если кто не догадался, то нужно обработать событие нажатие клавиши этот параметр находится в lParam Код (Text): HookKeyProc proc nCode0: DWORD, wParam0: DWORD, lParam0: DWORD .IF nCode0 == HC_ACTION mov eax, lParam0 shr eax,16 and eax, KF_UP .IF (eax == 0) invoke MessageBox,NULL,addr wParam0,addr PressMsg,MB_OK .ENDIF .ENDIF invoke CallNextHookEx, Hook2 ,nCode0, wParam0, lParam0; ret HookKeyProc endp Вот это правильно работает)
И ещё вопрос... Извините, не по теме! У меня стоит оутпост 4 (Новую версию ставить лень) Так вот когда я хукаю доверенное приложение и пытаюсь лезть в интернет например, - он не реагирует. Кроме того когда хукаю сам оутпост он виснет, пока не выгружу dll. Может у меня настройки безопасности не правильные?