Проблемы с перехватом комбинации клавиш

Тема в разделе "WASM.BEGINNERS", создана пользователем Sun07, 23 апр 2009.

  1. Sun07

    Sun07 New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2009
    Сообщения:
    52
    Глобальный хук на клавиатуру, при нажатии Ctrl+Alt+Del выводится 2 окна вместо 3-х, потом и поодиночные нажатия не срабатывают(?). Код Dll:
    Код (Text):
    1.     .386
    2.  
    3.    .model flat,stdcall
    4.    option casemap:none
    5.  
    6. ;   include \masm32\include\kernel32.inc
    7. ;   includelib \masm32\lib\kernel32.lib
    8.  
    9.    include \masm32\include\user32.inc
    10.    includelib \masm32\lib\user32.lib
    11.  
    12.    include \masm32\include\windows.inc
    13.  
    14.    .const
    15.    WM_KEYHOOK equ WM_USER+6
    16.  
    17.    .data
    18.     Ctrl_Alt_Del        dd 0    ;чтобы не было переполнения (как при DB)
    19.     NewVerOffset        db 0   
    20.     hInstanceDLL        dd 0
    21.     hInfo           db "Info",0
    22.  
    23.     FormatStr       db "%d",0
    24.  
    25.    .data?
    26.  
    27.     hHook dd ?
    28.     hWnd dd ?
    29.     buffout         db 12 dup(?)    ;десятиричное число =10 знаков + резерв!
    30.  
    31.    .code
    32.  
    33.   DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
    34.  
    35.        .if reason==DLL_PROCESS_ATTACH
    36.            push hInst
    37.            pop hInstanceDLL
    38.        .endif
    39.  
    40.        mov  eax,TRUE
    41.        ret
    42.    DllEntry Endp
    43.  
    44.  
    45.    KeyProc proc nCode:DWORD,wparam:DWORD,lparam:DWORD
    46.  
    47.        invoke CallNextHookEx,hHook,nCode,wparam,lparam
    48.  
    49.     cmp nCode,0
    50.     jb  r1
    51.  
    52. ;MSG * msg = (MSG * )lParam;
    53.  
    54.     mov edx,lparam
    55.         assume edx:PTR MSG
    56.  
    57.  
    58.     cmp lparam,0
    59.     je r1
    60.  
    61.     cmp [edx].message,WM_KEYDOWN
    62.     je c1
    63.     cmp [edx].message,WM_SYSKEYDOWN
    64.     je c1
    65.     jmp k1
    66.  
    67. c1:
    68.     invoke GetAsyncKeyState,VK_CONTROL
    69. call outn
    70.     cmp eax,0
    71.     jae k1
    72.     invoke GetAsyncKeyState,VK_MENU
    73. call outn
    74.     cmp eax,0
    75.     jae k1
    76.     invoke GetAsyncKeyState,VK_DELETE
    77. call outn
    78.     cmp eax,0
    79.     jae k1
    80. ;call outn
    81.  
    82. k1: cmp [edx].message,WM_CHAR
    83.     jne r1
    84.     cmp wparam,PM_REMOVE
    85.     jne r1
    86.    
    87.         invoke PostMessage,hWnd,WM_KEYHOOK,[edx].wParam,0
    88.  
    89. r1:       xor eax,eax
    90.        ret
    91.    KeyProc endp
    92.  
    93.  
    94.    InstallHook proc hwnd:DWORD
    95.        push hwnd
    96.        pop hWnd
    97.  
    98.        invoke SetWindowsHookEx,WH_GETMESSAGE,addr KeyProc,hInstanceDLL,NULL
    99.        mov hHook,eax
    100.        ret
    101.    InstallHook endp
    102.  
    103.    UnInstallHook proc
    104.       invoke UnhookWindowsHookEx,hHook
    105.       ret
    106.    UnInstallHook endp
    107.  
    108. outn proc
    109. ;вывод числа EAX на экран
    110. invoke wsprintf,offset buffout,offset FormatStr, eax
    111. invoke MessageBox,0,offset buffout,offset hInfo,MB_IconWarning
    112. ret
    113. outn endp
    114.  
    115.    End DllEntry
     
  2. Sun07

    Sun07 New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2009
    Сообщения:
    52
    получается, что GetAsyncKeyState каким-то чудом влияет на приход WM_KEYDOWN, т.к. не определяется даже Ctrl+Alt по коду:
    Код (Text):
    1.     invoke GetAsyncKeyState,VK_CONTROL
    2.     and eax,00008000h
    3.     jz k1
    4.     invoke GetAsyncKeyState,VK_MENU
    5.     and eax,00008000h
    6.     jz k1
    7. call outn
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Sun07
    Ctrl+Alt+Del - это особая комбинация. На уровне WH_GETMESSAGE ее не поймать.

    ps гугли ctrl+alt+del+gina (или +msgina)
     
  4. Sun07

    Sun07 New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2009
    Сообщения:
    52
    тут что-то не то. Ctrl+Alt тоже не ловит в dll. Вынес в exe - Ctrl+Alt ловит.
     
  5. Sun07

    Sun07 New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2009
    Сообщения:
    52
    и в exe тоже срабатывает через раз. Как только появляется комбинация клавиш Ctr+Alt, сообщения как-то ходят нестабильно (совсем нестабильно :)). Одиночное же нажатие клавиши всегда ловится. Кто-то тестил, те же проблемы? А то у меня иногда блокируется клава (возможно, клавиши залипают, особенно Ctrl) :dntknw:
     
  6. Sun07

    Sun07 New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2009
    Сообщения:
    52
    WM_SYSKEYDOWN для Ctr+Alt появляется после нажатия Alt и закрытия окна от call outn сразу после WM_SYSKEYDOWN (фокус переходит свёрнутому окну в панели задач), в остальных случаях оно не появляется. Почему?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Не так чтобы не стабильно но действительно несколько нелогично :)) - при отпускании Ctr приходит WM_SYSKEYUP, а при отпускании Alt - WM_KEYUP.
    В аттаче примитивный, недоделанный тестер для исследования последовательностей сообщений.