Глобальный хук на клавиатуру, при нажатии Ctrl+Alt+Del выводится 2 окна вместо 3-х, потом и поодиночные нажатия не срабатывают(?). Код Dll: Код (Text): .386 .model flat,stdcall option casemap:none ; include \masm32\include\kernel32.inc ; includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib include \masm32\include\windows.inc .const WM_KEYHOOK equ WM_USER+6 .data Ctrl_Alt_Del dd 0 ;чтобы не было переполнения (как при DB) NewVerOffset db 0 hInstanceDLL dd 0 hInfo db "Info",0 FormatStr db "%d",0 .data? hHook dd ? hWnd dd ? buffout db 12 dup(?) ;десятиричное число =10 знаков + резерв! .code DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD .if reason==DLL_PROCESS_ATTACH push hInst pop hInstanceDLL .endif mov eax,TRUE ret DllEntry Endp KeyProc proc nCode:DWORD,wparam:DWORD,lparam:DWORD invoke CallNextHookEx,hHook,nCode,wparam,lparam cmp nCode,0 jb r1 ;MSG * msg = (MSG * )lParam; mov edx,lparam assume edx:PTR MSG cmp lparam,0 je r1 cmp [edx].message,WM_KEYDOWN je c1 cmp [edx].message,WM_SYSKEYDOWN je c1 jmp k1 c1: invoke GetAsyncKeyState,VK_CONTROL call outn cmp eax,0 jae k1 invoke GetAsyncKeyState,VK_MENU call outn cmp eax,0 jae k1 invoke GetAsyncKeyState,VK_DELETE call outn cmp eax,0 jae k1 ;call outn k1: cmp [edx].message,WM_CHAR jne r1 cmp wparam,PM_REMOVE jne r1 invoke PostMessage,hWnd,WM_KEYHOOK,[edx].wParam,0 r1: xor eax,eax ret KeyProc endp InstallHook proc hwnd:DWORD push hwnd pop hWnd invoke SetWindowsHookEx,WH_GETMESSAGE,addr KeyProc,hInstanceDLL,NULL mov hHook,eax ret InstallHook endp UnInstallHook proc invoke UnhookWindowsHookEx,hHook ret UnInstallHook endp outn proc ;вывод числа EAX на экран invoke wsprintf,offset buffout,offset FormatStr, eax invoke MessageBox,0,offset buffout,offset hInfo,MB_IconWarning ret outn endp End DllEntry
получается, что GetAsyncKeyState каким-то чудом влияет на приход WM_KEYDOWN, т.к. не определяется даже Ctrl+Alt по коду: Код (Text): invoke GetAsyncKeyState,VK_CONTROL and eax,00008000h jz k1 invoke GetAsyncKeyState,VK_MENU and eax,00008000h jz k1 call outn
Sun07 Ctrl+Alt+Del - это особая комбинация. На уровне WH_GETMESSAGE ее не поймать. ps гугли ctrl+alt+del+gina (или +msgina)
и в exe тоже срабатывает через раз. Как только появляется комбинация клавиш Ctr+Alt, сообщения как-то ходят нестабильно (совсем нестабильно ). Одиночное же нажатие клавиши всегда ловится. Кто-то тестил, те же проблемы? А то у меня иногда блокируется клава (возможно, клавиши залипают, особенно Ctrl)
WM_SYSKEYDOWN для Ctr+Alt появляется после нажатия Alt и закрытия окна от call outn сразу после WM_SYSKEYDOWN (фокус переходит свёрнутому окну в панели задач), в остальных случаях оно не появляется. Почему?
Не так чтобы не стабильно но действительно несколько нелогично ) - при отпускании Ctr приходит WM_SYSKEYUP, а при отпускании Alt - WM_KEYUP. В аттаче примитивный, недоделанный тестер для исследования последовательностей сообщений.