Доброго времени суток. В своем коде пытаюсь установить хук WH_JOURNALRECORD чтобы отлавливать и в последующем обрабатывать нажатия некоторых клавиш. делаю так: Код (Text): ..... .data dwHookHandle dd 0 .code h00k_install proc cmp dwHookHandle, 0 jz @F ret @@: push 0 call GetModuleHandleA test eax, eax jnz @F ret @@: push 0 push eax push offset h00k_proc push WH_JOURNALRECORD call SetWindowsHookEx mov dwHookHandle, eax ret h00k_install endp ;////////////////////////////////////////////////////////////////////////// h00k_proc proc nCode : DWORD, WParam : WORD, LParam : DWORD LOCAL E_MSG : EVENTMSG cmp nCode, 0 ; HC_ACTION jnz _next_h00k cmp WParam, 0 jz _next_h00k push LParam pop E_MSG mov ebx, dword ptr [E_MSG] _key_process: cmp ebx, WM_KEYDOWN jnz _next_h00k ; WORK WITH KEYBOARD invoke MessageBoxA,0,0,0,0 _next_h00k: push LParam push WParam push nCode push dwHookHandle call CallNextHookEx ret h00k_proc endp ;////////////////////////////////////////////////////////////////////////// start: call h00k_install @@: push 1 call Sleep jmp @B .... прога зависает при вызове SetWindowsHookEx... как решить данную проблему? может кто сталкивался? благодарю за внимание.
GeNeZiS Код (Text): push LParam pop E_MSG В LParam - указатель на EVENTMSG, E_MSG - это структура EVENTMSG. Как ты себе представляешь pop структуры? Какого эффекта ты ожидаешь от pop'а?
хм. точно)) недоглядел. мне нужно получить из EVENTMSG значение поля message. т.е. получаю так Код (Text): ... mov ebx, dword ptr LParam ... эффект тот же. прога висит. что я еще делаю не правильно?
GeNeZiS > прога висит Как ты это определяешь? > что я еще делаю не правильно? Например: 1) не сохраняешь значение регистра EBX; 2) зачем cmp nCode, 0 и cmp WParam, 0 перед анализом значения EVENTMSG.message, согласно документации (msdn: JournalPlaybackProc Function) "lParam ... This parameter is valid only when the code parameter is HC_GETNEXT", а HC_GETNEXT определен как единица; 3) не критично, однако WPARAM под win32 - это DWORD. > нужно получить из EVENTMSG значение поля message Синтаксис masm Код (Text): mov eax, LParam ;; теперь в EAX указатель на EVENTMSG, общаться с полем message, например, можно так: cmp (EVENTMSG ptr [eax]).message, WM_KEYDOWN ;; или cmp dword ptr [eax], WM_KEYDOWN ;; или cmp [eax.EVENTMSG].message, WM_KEYDOWN ;; или assume eax : ptr EVENTMSG cmp [eax].message, WM_KEYDOWN
сделал таким образом: Код (Text): h00k_proc proc nCode : DWORD, WParam : WORD, LParam : DWORD cmp nCode, 1 ; HC_GETNEXT jnz _next_h00k mov ebx, LParam push ebx _key_process: pop ebx cmp dword ptr [ebx], WM_KEYDOWN jnz _next_h00k ; WORK WITH KEYBOARD invoke MessageBoxA,0,0,0,0 _next_h00k: push LParam push WParam push nCode push dwHookHandle call CallNextHookEx ret h00k_proc endp к сожалению по прежнему ничего не работает. до нажатия CTRL+ALT+DEL система не отвечает на события мыши и клавиатуры... в чем еще может быть ошибка?
GeNeZiS > в чем еще может быть ошибка? См. #4. Ты не учел п.1. Я был не прав – п.3 критичен. Посмотри на код, генерируемый для push WParam, в стек кладется слово, что нарушает, нормальное для win32, выравнивание стека по 4-ех байтной границе.