Не получается отключить клавиатуру и мышь: Код (Text): .data? hHookKeyboard dd ? hHookMouse dd ? .code LowLevelKeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD invoke CallNextHookEx,hHookKeyboard,nCode,wParam,lParam xor eax,eax ret LowLevelKeyboardProc endp LowLevelMouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD invoke CallNextHookEx,hHookMouse,nCode,wParam,lParam xor eax,eax ret LowLevelMouseProc endp start: invoke SetWindowsHookEx,WH_KEYBOARD_LL,ADDR LowLevelKeyboardProc,NULL,NULL mov hHookKeyboard,eax invoke SetWindowsHookEx,WH_MOUSE_LL,ADDR LowLevelMouseProc,NULL,NULL mov hHookMouse,eax ;здесь какой-нибудь код invoke ExitProcess,NULL end start Функция SetWindowsHookEx возвращает NULL.
Partner, народ в этой ветке www.wasm.ru/forum/viewtopic.php?id=29718 утверждает, что dll не нужна. Код (Text): .code LowLevelKeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD .if nCode < 0 invoke CallNextHookEx,NULL,nCode,wParam,lParam .endif ret LowLevelKeyboardProc endp start: invoke GetModuleHandle,NULL mov hInstance,eax invoke SetWindowsHookEx,WH_KEYBOARD_LL,addr LowLevelKeyboardProc,hInstance,0 mov hHookKeyboard,eax invoke Sleep,10000 invoke UnhookWindowsHookEx,hHookKeyboard invoke ExitProcess,NULL end start Клавиатура не блокируется и комп сильно тормозит.
Ошыбся, я имел ввиду SwitchDesktop На ХР сп 3 полностью можно было "заблокировать" комп, на вин 7 диспетчер не блокируется.
Можно просто выгрузить проводник, а затем загрузить, результат будет тот же самый. Мне так не нравится. Нужно, чтобы комп не реагировал на нажатия клавиш клавиатуры и кнопок мыши, но при этом курсор мог перемещаться на экране.
Если я не ошибаюсь то это в том случаии если делаешь в хук в "своем"(то которое вызвало SetWindowsHookEx ) приложении. Тем более WH_KEYBOARD_LL и WH_MOUSE_LL только для глобальной установки так что dll по любом нужна. http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
XshStasX, хорошо, вот ещё один пример http://haali.su/winutils/lswitch.c. Программа прекрасно работает и без dll'ки.
Кое-что получилось. Код (Text): .code KeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD invoke CallNextHookEx,NULL,nCode,wParam,lParam xor eax,eax inc eax ret KeyboardProc endp MouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD invoke CallNextHookEx,NULL,nCode,wParam,lParam .if wParam!=WM_MOUSEMOVE xor eax,eax inc eax .endif ret MouseProc endp start: invoke GetModuleHandle,NULL mov ebx,eax invoke SetWindowsHookEx,WH_KEYBOARD_LL,addr KeyboardProc,eax,0 mov hHookKeyboard,eax invoke SetWindowsHookEx,WH_MOUSE_LL,addr MouseProc,ebx,0 mov hHookMouse,eax .while TRUE invoke GetMessage,addr msg,NULL,0,0 .break .if !eax invoke TranslateMessage,addr msg invoke DispatchMessage,addr msg .endw invoke UnhookWindowsHookEx,hHookKeyboard invoke UnhookWindowsHookEx,hHookMouse invoke ExitProcess,NULL end start Для завершения программы требуется перезагрузка. Даже "ctrl-alt-del" не помогает. Если цикл заменить на другой, без GetMessage Код (Text): .while TRUE ;чего-нибудь делаю .endw то клавиатура и мышь не блокируются. Это плохо. Кроме того процессор грузится на 100%.
А почему ты в MouseProc и KeyboardProc получаешь 12байт чеез стек, а очищаешь 0 байт из стека? Есно будет грузится, это ведь бесконечный цикл ...
Есть главное окно и зависимое от него всплывающее окно, которое появляется с задержкой в несколько секунд. Нужно поймать этот момент. Код (Text): invoke FindWindow,addr ClassName,NULL mov ebx,eax .REPEAT invoke GetWindow,ebx,GW_ENABLEDPOPUP .UNTIL eax!=NULL С таким циклом устройства ввода не заблокируешь. Получает ли главное окно какое-нибудь сообщение в момент создания зависимого окна? Можно ли его отловить через GetMessage?
Тут надо на макросы посмотреть. Например, в fasm внутри proc определяется макрос ret, который делает эпилог и очищает стек от параметров сам. Думаю в MASM так же. Ну а если интересно как это сделать самому, то достаточно команды ret 12. Однако тогда придёться самому делать эпилог, так что лучше положиться на макросы.