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

Discussion in 'WASM.BEGINNERS' started by gale1238, Jan 16, 2010.

  1. gale1238

    gale1238 New Member

    Blog Posts:
    0
    Joined:
    Mar 21, 2009
    Messages:
    72
    Не получается отключить клавиатуру и мышь:
    Code (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 Павел

    Blog Posts:
    0
    Joined:
    Feb 28, 2008
    Messages:
    917
    Location:
    Los Angeles
    Глобальные хуки можно ставить только из DLL
     
  3. gale1238

    gale1238 New Member

    Blog Posts:
    0
    Joined:
    Mar 21, 2009
    Messages:
    72
    Partner,
    народ в этой ветке www.wasm.ru/forum/viewtopic.php?id=29718 утверждает, что dll не нужна.
    Code (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

    Blog Posts:
    0
    Joined:
    Oct 30, 2009
    Messages:
    566
    Если тебе нужен "блокиратор винды", то все делается значительно проще
     
  5. XshStasX

    XshStasX New Member

    Blog Posts:
    0
    Joined:
    Aug 9, 2008
    Messages:
    991
    Да-да, можно создать отдельную ссесию.
     
  6. VaZoNeZ

    VaZoNeZ New Member

    Blog Posts:
    0
    Joined:
    Jul 12, 2009
    Messages:
    121
    XshStasX
    Всмысле "сессию"? Что именно подразумевается под этим?
     
  7. XshStasX

    XshStasX New Member

    Blog Posts:
    0
    Joined:
    Aug 9, 2008
    Messages:
    991
    Ошыбся, я имел ввиду SwitchDesktop
    На ХР сп 3 полностью можно было "заблокировать" комп, на вин 7 диспетчер не блокируется.
     
  8. gale1238

    gale1238 New Member

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

    XshStasX New Member

    Blog Posts:
    0
    Joined:
    Aug 9, 2008
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Mar 21, 2009
    Messages:
    72
    XshStasX,
    хорошо, вот ещё один пример http://haali.su/winutils/lswitch.c.
    Программа прекрасно работает и без dll'ки.
     
  11. gale1238

    gale1238 New Member

    Blog Posts:
    0
    Joined:
    Mar 21, 2009
    Messages:
    72
    Кое-что получилось.
    Code (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
    Code (Text):
    1.     .while TRUE
    2.        ;чего-нибудь делаю
    3.     .endw
    то клавиатура и мышь не блокируются. Это плохо. Кроме того процессор грузится на 100%.
     
  12. XshStasX

    XshStasX New Member

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

    ntcdm New Member

    Blog Posts:
    0
    Joined:
    Apr 17, 2007
    Messages:
    247
    Можно создать новое окно на отдельном десктопе со скриншотом экрана и переключится туда =)
     
  14. gale1238

    gale1238 New Member

    Blog Posts:
    0
    Joined:
    Mar 21, 2009
    Messages:
    72
    Есть главное окно и зависимое от него всплывающее окно, которое появляется с задержкой в несколько секунд. Нужно поймать этот момент.
    Code (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

    Blog Posts:
    0
    Joined:
    Mar 21, 2009
    Messages:
    72
    XshStasX,
    не умею. Помоги, пожалуйста.
     
  16. KIV

    KIV Member

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