блокировка клавиатуры и мыши

Тема в разделе "WASM.BEGINNERS", создана пользователем gale1238, 16 янв 2010.

  1. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Не получается отключить клавиатуру и мышь:
    Код (Text):
    1. .data?
    2.     hHookKeyboard dd ?
    3.     hHookMouse dd ?
    4. .code
    5.     LowLevelKeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    6.         invoke CallNextHookEx,hHookKeyboard,nCode,wParam,lParam
    7.         xor eax,eax
    8.         ret
    9.     LowLevelKeyboardProc endp
    10.     LowLevelMouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    11.         invoke CallNextHookEx,hHookMouse,nCode,wParam,lParam
    12.         xor eax,eax
    13.         ret
    14.     LowLevelMouseProc endp
    15. start:
    16.     invoke SetWindowsHookEx,WH_KEYBOARD_LL,ADDR LowLevelKeyboardProc,NULL,NULL
    17.     mov hHookKeyboard,eax
    18.     invoke SetWindowsHookEx,WH_MOUSE_LL,ADDR LowLevelMouseProc,NULL,NULL
    19.     mov hHookMouse,eax
    20.     ;здесь какой-нибудь код
    21.     invoke ExitProcess,NULL
    22. end start
    Функция SetWindowsHookEx возвращает NULL.
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Глобальные хуки можно ставить только из DLL
     
  3. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Partner,
    народ в этой ветке www.wasm.ru/forum/viewtopic.php?id=29718 утверждает, что dll не нужна.
    Код (Text):
    1. .code
    2.     LowLevelKeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    3.        .if nCode < 0
    4.           invoke CallNextHookEx,NULL,nCode,wParam,lParam
    5.        .endif
    6.        ret
    7.     LowLevelKeyboardProc endp
    8. start:
    9.     invoke GetModuleHandle,NULL
    10.     mov hInstance,eax
    11.     invoke SetWindowsHookEx,WH_KEYBOARD_LL,addr LowLevelKeyboardProc,hInstance,0
    12.     mov hHookKeyboard,eax
    13.     invoke Sleep,10000
    14.     invoke UnhookWindowsHookEx,hHookKeyboard
    15.     invoke ExitProcess,NULL
    16. end start
    Клавиатура не блокируется и комп сильно тормозит.
     
  4. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Если тебе нужен "блокиратор винды", то все делается значительно проще
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Да-да, можно создать отдельную ссесию.
     
  6. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    XshStasX
    Всмысле "сессию"? Что именно подразумевается под этим?
     
  7. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Ошыбся, я имел ввиду SwitchDesktop
    На ХР сп 3 полностью можно было "заблокировать" комп, на вин 7 диспетчер не блокируется.
     
  8. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Можно просто выгрузить проводник, а затем загрузить, результат будет тот же самый. Мне так не нравится.
    Нужно, чтобы комп не реагировал на нажатия клавиш клавиатуры и кнопок мыши, но при этом курсор мог перемещаться на экране.
     
  9. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Если я не ошибаюсь то это в том случаии если делаешь в хук в "своем"(то которое вызвало SetWindowsHookEx ) приложении.


    Тем более WH_KEYBOARD_LL и WH_MOUSE_LL только для глобальной установки так что dll по любом нужна.
    http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
     
  10. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    XshStasX,
    хорошо, вот ещё один пример http://haali.su/winutils/lswitch.c.
    Программа прекрасно работает и без dll'ки.
     
  11. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Кое-что получилось.
    Код (Text):
    1. .code
    2. KeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    3.     invoke CallNextHookEx,NULL,nCode,wParam,lParam
    4.     xor eax,eax
    5.     inc eax
    6.     ret
    7. KeyboardProc endp
    8. MouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    9.     invoke CallNextHookEx,NULL,nCode,wParam,lParam
    10.     .if wParam!=WM_MOUSEMOVE
    11.        xor eax,eax
    12.        inc eax
    13.     .endif
    14.     ret
    15. MouseProc endp
    16. start:
    17.     invoke GetModuleHandle,NULL
    18.     mov ebx,eax
    19.     invoke SetWindowsHookEx,WH_KEYBOARD_LL,addr KeyboardProc,eax,0
    20.     mov hHookKeyboard,eax
    21.     invoke SetWindowsHookEx,WH_MOUSE_LL,addr MouseProc,ebx,0
    22.     mov hHookMouse,eax
    23.     .while TRUE
    24.        invoke GetMessage,addr msg,NULL,0,0
    25.        .break .if !eax
    26.        invoke TranslateMessage,addr msg
    27.        invoke DispatchMessage,addr msg
    28.     .endw
    29.     invoke UnhookWindowsHookEx,hHookKeyboard
    30.     invoke UnhookWindowsHookEx,hHookMouse
    31.     invoke ExitProcess,NULL
    32. end start
    Для завершения программы требуется перезагрузка. Даже "ctrl-alt-del" не помогает.
    Если цикл заменить на другой, без GetMessage
    Код (Text):
    1.     .while TRUE
    2.        ;чего-нибудь делаю
    3.     .endw
    то клавиатура и мышь не блокируются. Это плохо. Кроме того процессор грузится на 100%.
     
  12. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    А почему ты в MouseProc и KeyboardProc получаешь 12байт чеез стек, а очищаешь 0 байт из стека?
    Есно будет грузится, это ведь бесконечный цикл ...
     
  13. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Можно создать новое окно на отдельном десктопе со скриншотом экрана и переключится туда =)
     
  14. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Есть главное окно и зависимое от него всплывающее окно, которое появляется с задержкой в несколько секунд. Нужно поймать этот момент.
    Код (Text):
    1.     invoke FindWindow,addr ClassName,NULL
    2.     mov ebx,eax
    3.     .REPEAT
    4.        invoke GetWindow,ebx,GW_ENABLEDPOPUP
    5.     .UNTIL eax!=NULL
    С таким циклом устройства ввода не заблокируешь.
    Получает ли главное окно какое-нибудь сообщение в момент создания зависимого окна?
    Можно ли его отловить через GetMessage?
     
  15. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    XshStasX,
    не умею. Помоги, пожалуйста.
     
  16. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Тут надо на макросы посмотреть. Например, в fasm внутри proc определяется макрос ret, который делает эпилог и очищает стек от параметров сам. Думаю в MASM так же. Ну а если интересно как это сделать самому, то достаточно команды ret 12. Однако тогда придёться самому делать эпилог, так что лучше положиться на макросы.