Процедура на перхват сообщений (в DLL, системный хук): Код (Text): kp proc nCode:DWORD,wParam:DWORD,lParam:DWORD ; KeyboardProc invoke CallNextHookEx,hHook,nCode,wParam,lParam invoke MessageBox,NULL,addr szError,ADDR szError,MB_OK ret kp endp При нажатии на кнопки выдает 2 сообщения. Всё правильно: на WM_KEYDOWN и WM_KEYUP. Далее делаем: Код (Text): kp proc nCode:DWORD,wParam:DWORD,lParam:DWORD ; KeyboardProc invoke CallNextHookEx,hHook,nCode,wParam,lParam .if nCode==WM_KEYUP invoke MessageBox,NULL,addr szError,ADDR szError,MB_OK .endif ret kp endp По идее должно быть одно сообщение, но MessageBox'ов не наблюдается ни одного! В чем ошибка?
На сколько помню этот параметр передаётся не в nCode. Лучше выведи все параметры, и посмотри что приходит при нажатии.
Опытным путем получено: nCode=0 всегда, wParam=код клавиши, lParam: при KEYDOWN=7-значному числу(напр. 230001), а при KEYUP: lParam = (lParam при KEYDOWN)+0c0000000h (0c0230001h) Условие: Код (Text): .if lParam > 0c0000000 ; это KEYUP .endif
Хм. А в MSDN религия не позволяет заглянуть? Код (Text): lParam [in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values. ... 30 Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up. ...
A так получается 2 msgbox'a: Код (Text): test lParam,20000000h jnz mmm1 invoke MessageBox,NULL,addr buffer1,ADDR szAppName,MB_OK mmm1: nop