Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Maus- und Tastaturrecorder (https://www.delphipraxis.net/30504-maus-und-tastaturrecorder.html)

Schneck 25. Sep 2004 17:56


Maus- und Tastaturrecorder
 
Hallo,

ich hätte gerne einen Maus- und Tastaturecorder selbst programmiert ... nur die einfachsten Grundfunktionen:

Aufzeichnen von Mausklicks und Tastatureingaben.
Speichern der Aufzeichnungen in einem editierbaren Textfeld.
Abspielen der Aufzeichnung.

Das kann doch nicht so schierig sein. Hab mich eingelesen und bin immer und immer wieder auf die Info gestoßen, dass man dabei um Hooks nicht herumkommt. Hooks sind aber ein Level zu hoch für mich, hab mir auch verschiedene Programmierbeispiele von Asserbad und Co angesehen, kappier aber sauber nix!

Das mit dem Speichern der Aufzeichnungen und Abspielen sollte ich irgendwie hinkriegen (ohne Hooks) z. B. mit mouse_event(....) Befehlen, aber wie kann ich Maus- und Tastatureingabe ohne Hooks abfangen, wenn sie an andere Fenster gerichtet sind? kann mir da jemand mööööööglicherweise einen Tipp geben oder ein einfaches Hook-Beispiel zeigen, das auch in meinem Hirn funzt?!

Grüße
Schneck
Dankt ;-)

Newbie44 25. Sep 2004 18:00

Re: Maus- und Tastaturrecorder
 
Sozusagen ein Mouse- and Keylogger, mit wiedergabefunktion

sebby :zwinker:

Assarbad 25. Sep 2004 19:03

Re: Maus- und Tastaturrecorder
 
Zitat:

Zitat von Schneck
Das kann doch nicht so schierig sein. Hab mich eingelesen und bin immer und immer wieder auf die Info gestoßen, dass man dabei um Hooks nicht herumkommt. Hooks sind aber ein Level zu hoch für mich, hab mir auch verschiedene Programmierbeispiele von Asserbad und Co angesehen, kappier aber sauber nix!

Was genau kapierst du denn nicht?

Zitat:

Zitat von Schneck
Das mit dem Speichern der Aufzeichnungen und Abspielen sollte ich irgendwie hinkriegen (ohne Hooks)

Logisch, denn Hooks werden vom System als Benachrichtigung an dich gesandt, also können Hooks schlecht ein Tastatur- oder Mausereignis auslösen!

Zitat:

Zitat von Schneck
z. B. mit mouse_event(....) Befehlen, aber wie kann ich Maus- und Tastatureingabe ohne Hooks abfangen, wenn sie an andere Fenster gerichtet sind?

Garnicht (es sei denn du bastelst dir einen kleinen Treiber ... da aber Hooks genau das gleiche ermöglichen, wäre der Treiber wohl Overkill).
Es gibt eine Ausnahme, die ich in EDA benutze. Die funktioniert aber nur dadurch, daß die Maustaste gedrückt bleibt.

Zitat:

Zitat von Schneck
kann mir da jemand mööööööglicherweise einen Tipp geben oder ein einfaches Hook-Beispiel zeigen, das auch in meinem Hirn funzt?!

Wie einfach muß es denn noch sein? Ich habe ja nicht nur Beispiele, sondern ein Tutorial zum Thema verfaßt.

Schneck 25. Sep 2004 21:44

Re: Maus- und Tastaturrecorder
 
Hallo Assarbad,

nun ja, das mit dem nullokapieren bezieht sich auf meine minimale Programmiererfahrung ... habe gestern zum erstenmal überhaupt überrissen, was DLLs sind und dass man sie selber machen kann und heute will ich Hooks verstehen ... wollte ich eigentlich nicht und hab deshalb nach einen anderen Weg gefragt. :mrgreen:
Naja nutzt nix, werd mir dein Hook-Tutorium doch genauer zu Gemüte ziehen müssen. Das beigelegt Beispiel (Sourcecode) zum Downloaden war für mich etwas zu unübersichtlich, aber dein pdf ist einfach Spitze, sehr ausführlich und übersichtlich. Großes Kompliment, hab im weiten www lange gesucht aber nichts vergleichbares (deutschsprachiges) gefunden.

Das mit dem Treiber programmieren war aber wohl ein Scherz?!

Fals ix weita nix kapir, bin i nochamal lästik...

Bis dahin
danke für die Rückmeldung
Grüße
Schneck

edosoft 26. Sep 2004 00:43

Re: Maus- und Tastaturrecorder
 
Liste der Anhänge anzeigen (Anzahl: 1)
mit nem treiber würds wohl besser gehen aber für dein zweck ist ein hook doch recht gut.

ich hab mir mal da ein maushook gebaut, ne dll halt.
(anhang)
die dll fügst dann so ein:

Delphi-Quellcode:
const
  WM_MOUSE_HOOK = WM_USER + 52013;

function Mouse_CreateHook(hWnd: HWND): Boolean; stdcall; external 'MouseHook.dll';
function Mouse_DeleteHook: Boolean; stdcall; external 'MouseHook.dll';



//init
Mouse_CreateHook(Application.Handle);



//finish
Mouse_DeleteHook;




procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
  X, Y: Integer;
begin
if Msg.message = WM_MOUSE_HOOK then
  begin
  X := Msg.wParam; //x-koordinate der maus
  Y := Msg.lParam; //y-koodrinate
  [..]
  end;
end;
achja
diese funktion registriert halt sowas wie ein OnMouseMove event, aber halt global.
du könntest ja dann zum biespiel alle punkte speichern, die da mit dem event oben ausgegeben werden, und nachher halt wieder so abspielen.
(das ist en event von einem tAppEvents.)

Assarbad 26. Sep 2004 11:35

Re: Maus- und Tastaturrecorder
 
Zitat:

Zitat von Schneck
nun ja, das mit dem nullokapieren bezieht sich auf meine minimale Programmiererfahrung ... habe gestern zum erstenmal überhaupt überrissen, was DLLs sind und dass man sie selber machen kann und heute will ich Hooks verstehen ... wollte ich eigentlich nicht und hab deshalb nach einen anderen Weg gefragt. :mrgreen:

Gib dir selber etwas Zeit! Man lernt es nicht von heute auf morgen, daher lieber etwas mehr Zeit in die Lernphase investieren und etwas besseres als Resultat haben.

Zitat:

Zitat von Schneck
Naja nutzt nix, werd mir dein Hook-Tutorium doch genauer zu Gemüte ziehen müssen. Das beigelegt Beispiel (Sourcecode) zum Downloaden war für mich etwas zu unübersichtlich, aber dein pdf ist einfach Spitze, sehr ausführlich und übersichtlich. Großes Kompliment, hab im weiten www lange gesucht aber nichts vergleichbares (deutschsprachiges) gefunden.

Eigentlich würde ich gerne jemanden haben, der das gemeinsam mit mir macht, denn ich bin kein guter Didakt, aber dafür umso besserer Autodidakt.

Zitat:

Zitat von Schneck
Das mit dem Treiber programmieren war aber wohl ein Scherz?!

Nein, nur die Alternative zu globalen Hooks ;)

Zitat:

Zitat von Schneck
Fals ix weita nix kapir, bin i nochamal lästik...

Jäderzait - hir sint dier ale görn behülflich :zwinker:

Schneck 27. Sep 2004 21:16

Re: Maus- und Tastaturrecorder
 
Bin fleißig beim Üben ( :cheers: ). Aber bis was ansehnliches rauskommt dauert's noch ein Weilchen.
Den Code von edesoft hab ich noch nicht zum Laufen gebracht, aber mach nix, ich bastel einfach ein bischen herum.
Sobald jedenfalls konkrete unüberwindliche psychtraumatische egozerstöhrende selbstzerfleischende Wissenslücken sich meinem einfältigen Geist entgegenstellen, und das werden sie ganz bestimmt (Murphy's Gesetz!), meld ich mich wiiiiiiiieder.

Bis dahin
Grüße vom
Schneck

edosoft 28. Sep 2004 20:31

Re: Maus- und Tastaturrecorder
 
Zitat:

Zitat von edosoft
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);

Des war so gemeint dass du auf dein "Form1" ein "TAppEvents" oder so ähnlich plazierst und bei events auf "OnMessage" doppelklickst dann den rest des codes für diese funktion einfügen.

glkgereon 27. Aug 2005 15:05

Re: Maus- und Tastaturrecorder
 
ich hol den thread mal wieder hoch....wärest du eventuell bereit denn quelltext dieser dll offenzulegen?

ich möchte so etwas ähnliches machen, möchte aber ungern eine dll nehmen :)

edosoft 28. Aug 2005 15:59

Re: Maus- und Tastaturrecorder
 
hi,

@glkgereon:
das geht leider nur per dll (soviel ich weis, wenns nicht stimmt bitte berichtigt mich).
wenn du einen hook im programm drin machst dann gilt er nur für das programm, d.h. du kriegst keine tastatur rückgaben wenn das fenster des programms nicht aktiv ist. wenn du aber den hook in einer dll datei anwendest wird er systemweit ausgeführt und die tastaturrückgabe funktioniert immer, egal welches programm gerade aktiv ist.

quellcode der keyhook-dll
Delphi-Quellcode:
library KeyHook;

uses
  Windows,
  Messages;

{$R *.res}

type
  PHWND = ^HWND;

const
  WM_KEYBOARD_HOOK = WM_USER + 52012;

var
  hHook: LongWord = 0;
  Key: Word;
  KeyboardLayout: HKL;
  GetShiftKeys: Boolean;
  hWndBuffer: PHWND;
  hMMF: THandle;

function KeyboardProc(nCode: Integer; wParam: LongWord; lParam: LongWord): LongWord; stdcall;
var
  LastKey: Char;
  KeyState: TKeyboardState;
begin
Result := CallNextHookEx(hHook, nCode, wParam, lParam);
if nCode < 0 then Exit;
KeyboardLayout := GetKeyboardLayout(0);
GetKeyboardState(KeyState);
if ToAsciiEx(wParam, MapVirtualKeyEx(wParam, 2, KeyboardLayout), KeyState, @LastKey, 0, KeyboardLayout) > 0 then
  Key := Ord(LastKey)
else
  Key := wParam;
if ((lParam and $80000000) = 0) and (not (wParam in [16, 17, 18]) or GetShiftKeys) then
PostMessage(hwndBuffer^, WM_KEYBOARD_HOOK, Key, GetActiveWindow);
end;

function Key_CreateHook(hWnd: HWND; ShiftKeys: Boolean): Boolean; stdcall;
var
  bHWND: PHWND;
begin
hMMF := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE or SEC_COMMIT, 0, SizeOf(hWnd), 'EDO-SoftKeyHookHandle');
bHWND := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, SizeOf(HWND));
bHWND^ := hWnd;
UnmapViewOfFile(bHWND);
GetMem(hWndBuffer, SizeOf(HWND));
hWndBuffer^ := hWnd;
GetShiftKeys := ShiftKeys;
if hHook = 0 then
  hHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, hInstance, 0);
Result := hHook <> 0;
end;

function Key_DeleteHook: Boolean; stdcall;
begin
FreeMem(hWndBuffer);
CloseHandle(hMMF);
Result := UnhookWindowsHookEx(hHook);
hHook := 0;
end;

exports
  Key_CreateHook,
  Key_DeleteHook;

var
  MMF: THandle;

begin
MMF := OpenFileMapping(FILE_MAP_READ, false, 'EDO-SoftKeyHookHandle');
if MMF <> 0 then
  begin
  hWndBuffer := MapViewOfFile(MMF, FILE_MAP_READ, 0, 0, SizeOf(HWND));
  CloseHandle(MMF);
  end;
end.

quellcode der maushook dll:
Delphi-Quellcode:
library MouseHook;

uses
  Windows,
  Messages;

{$R *.res}

type
  PHWND = ^HWND;

const
  WM_MOUSE_HOOK = WM_USER + 52013;

var
  hHook: LongWord = 0;
  hWndBuffer: PHWND;
  hMMF: THandle;

function MouseProc(nCode: Integer; wParam: LongWord; lParam: LongWord): LongWord; stdcall;
var
  P: TPoint;
begin
Result := CallNextHookEx(hHook, nCode, wParam, lParam);
if nCode < 0 then Exit;
GetCursorPos(P);
P.Y := P.Y;
PostMessage(hwndBuffer^, WM_MOUSE_HOOK, P.X, P.Y);
end;

function Mouse_CreateHook(hWnd: HWND): Boolean; stdcall;
var
  bHWND: PHWND;
begin
hMMF := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE or SEC_COMMIT, 0, SizeOf(hWnd), 'EDO-SoftMouseHookHandle');
bHWND := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, SizeOf(HWND));
bHWND^ := hWnd;
UnmapViewOfFile(bHWND);
GetMem(hWndBuffer, SizeOf(HWND));
hWndBuffer^ := hWnd;
if hHook = 0 then
  hHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, hInstance, 0);
Result := hHook <> 0;
end;

function Mouse_DeleteHook: Boolean; stdcall;
begin
FreeMem(hWndBuffer);
CloseHandle(hMMF);
Result := UnhookWindowsHookEx(hHook);
hHook := 0;
end;

exports
  Mouse_CreateHook,
  Mouse_DeleteHook;

var
  MMF: THandle;

begin
MMF := OpenFileMapping(FILE_MAP_READ, false, 'EDO-SoftMouseHookHandle');
if MMF <> 0 then
  begin
  hWndBuffer := MapViewOfFile(MMF, FILE_MAP_READ, 0, 0, SizeOf(HWND));
  CloseHandle(MMF);
  end;
end.
der quellcode stammt nicht vollständig von mir ich hab ihn irgendwo rausgenommen und ein bischen optimiert (was ich vielleicht nochmal tun sollte...) kann gut sein dasses da bessere versionen gibt mein tastaturhook funktioniert auch nocht so richtig beispielsweise wir die nach-links taste als %-zeichen ausgegeben und ein anschlag auf der f1 taste wird als "p" ausgegeben.

ps: sorry wegen der verspäteten antwort, war auf ->rock am see

-dominik

FriFra 28. Aug 2005 17:32

Re: Maus- und Tastaturrecorder
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ist zwar jetzt leicht Off-Topic... aber unter Win3.x war so ein Programm serienmäßig dabei ;) ...

MisterNiceGuy 28. Aug 2005 18:26

Re: Maus- und Tastaturrecorder
 
hi ich habs schonmal angefangen und zwar HIER.
ABER: Ich scheitere daran, dass jeder Tastaturhook von meinem AntivirenProgramm erkannt wird. Somit ist das Programm... hmmm... sagen wir unschön :)

NicoDE 28. Aug 2005 18:47

Re: Maus- und Tastaturrecorder
 
Zitat:

Zitat von MisterNiceGuy
Ich scheitere daran, dass jeder Tastaturhook von meinem AntivirenProgramm erkannt wird.

Was für das AV-Programm spricht :)
Der Benutzer darf ruhig erfahren, dass sich eine neue (noch nicht autorisierte) DLL in fast allen Prozessen befindet. Zumal der Benutzer ja nur einmal entscheiden muss ob er der DLL vertraut (oder nicht).

edosoft 28. Aug 2005 19:05

Re: Maus- und Tastaturrecorder
 
Hi,

FriFra: das programm kenn ich des ist super damit kann mans ja auch wieder abspielen :)

MisterNiceGuy: liegt vielleicht daran dass du eine dll genommen hast die das virenprogramm schon kennt. wenn du aber selber eine schreibst bzw. die von mir nimmst und das virenprogramm die datei nicht kennt sollte es gehen. ich hab nurton 2005 drauf und bei mir geht die datei ohne probleme.

Luckie 28. Aug 2005 19:11

Re: Maus- und Tastaturrecorder
 
Jeder bessere Virenscanner sollte eigentlich einen Tastaturhook erkennen. AntVir ekennt meine Hook DLL von meinem LuckieSpy auch.

edosoft 28. Aug 2005 19:13

Re: Maus- und Tastaturrecorder
 
vielleicht is deine dll dem symantec team halt schon bekannt oder du hast irgendwelchen standard code drin der halt auch vonnem virus benützt wird...

FriFra 28. Aug 2005 19:27

Re: Maus- und Tastaturrecorder
 
Zitat:

Zitat von edosoft
vielleicht is deine dll dem symantec team halt schon bekannt oder du hast irgendwelchen standard code drin der halt auch vonnem virus benützt wird...

Nein... Der Hook an sich wird als Virenverdächtig erkant und gemeldet - völlig unabhängig davon ob die dll irgendwelche Übereinstimmungen mit irgend einem bekannten Virus hat. Es ist also völlig wurscht mit welchem Compiler compiliert wird, oder wie der Code aussieht es wird immer eine Meldung geben... aber wen stört das? Wenn der Benutzer weiß, was das Programm macht, dann wird es dem auch zustimmen :wink:

edosoft 28. Aug 2005 19:39

Re: Maus- und Tastaturrecorder
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi,

MisterNiceGuy:
kannst du mal testen ob meine dll mit deinem virenscanner geht?

ich hab mein testprogramm "keycount" angehängt das zählt die tastenanschläge und die mausbewegung in pixeln(wobie die falsch berechnet wird...) jedenfalls benützt das programm beide meiner dlls, die für die maus und für die tastatur. bitte mal testen und berichten was dein virenscanner dazu sagt :) thnx

MisterNiceGuy 29. Aug 2005 09:29

Re: Maus- und Tastaturrecorder
 
Hi ich bin erstm morgen wieder zuhause, aber dann probier ich's gleich aus :) Ich benutze übrigens AntiVir!

Puhbaehr 10. Nov 2005 12:44

Re: Maus- und Tastaturrecorder
 
Hmm... ich weiß jetzt nicht genau ob das das gleiche ist.
Aber meiner Meinung nach hab ich genau solche Hooks auch in meinem Programm ohne DLL. Und es funktioniert auch ohne, dass das Form im Vordergrund ist. Im Gegenteil, es gibt nicht mal ein Form.

Delphi-Quellcode:
// ...
RegisterHotKey (Form1.Handle, ord ('O'), MOD_CONTROL, ord ('O'));
// ...
Und ja und nein. Norton Antivirus (2003) reagiert nicht auf die Hooks. Aber ZoneAlarm schlägt Alarm. Es muss irgendwie über diese Hooks sitzen :)

Puhbaehr 10. Nov 2005 12:52

Re: Maus- und Tastaturrecorder
 
@edosoft: keycount

Dein Programm hat grad beim Beenden meinen Rechner flach gelegt. Zumindest ist der Explorer tot O.o
Das Programm selbst reagiert nicht mehr und die Taskleiste auch nicht mehr :cyclops: :gruebel:

Edit:
Habs grad nochmal ausprobiert. Beim Beenden über das "X" am Programmfenster funzt alles.
Beim Beenden über die Taskleiste, also Rechtsklick auf Taskleistenschaltfläche und dann auf schließen lasstet den Prozessor zu 99 % aus und der Rest bekommt keinen Saft mehr :stupid:
Gleiches passiert wenn ich das Programm übers Systemmenü des Programmes (Rechtsklick auf Titelleiste, oder Linksklick auf Programmicon) schließe. Scheint als rennt da irgendwas in eine Endlosschleife.

edosoft 10. Nov 2005 16:15

Re: Maus- und Tastaturrecorder
 
hi puhbaer,

stimmt, bei mir ist des auch so ich gucks mir gleich mal an wos problem liegen könnte.

ps: da ist halt ein multicore oder zimindest HT system gschickt da lastets den prozessor nur 50% aus...

mfg.

Nils_13 10. Nov 2005 16:36

Re: Maus- und Tastaturrecorder
 
Warum hilft man da überhaupt, im PureBasic Forum hat auch einer einen Hook geschrieben, muss das wirklich sein ? Ich würde es mich garnicht wagen so etwas zu fragen.

Puhbaehr 22. Mai 2006 14:43

Re: Maus- und Tastaturrecorder
 
So, Thread lange her, aber nach wie vor aktuell.

Nachdem mich eine Mail mit einer Frage über dieses Thema erreichte mach ich hier mal weiter:
(Da die Mail nichts privates enthält veröffentliche ich sie hier einfach mal:)
Zitat:

Zitat von agm65
Mail:
Titel: hilfe bei mouse hook problem
Inhalt der Nachricht:

zu deinem thread ....wie hast du das ohne die dll hingekriegt ?
ich suche nur nach einer function einfach den mouseklick (global) festzustellen ! danke !

Da diese Frage von dir in gleicher Weise auch hier behandelt wird: http://www.delphipraxis.net/internal...highlight=hook
knüpfe ich hier an beide Theman an.

(bla)

Ok mal schauen. Also wie man Hooks ohne DLLs hinbekommt weiß ich gar nicht.
Und ob die Funktion RegisterHotKey mit oder ohne DLLs arbeitete wusste ich auch nicht wirklich.

Also, wie weiter?
Strg halten und Klick auf die Funktion RegisterHotKey im Delphi.
Editor springt darauf hin in die Unit Windows.pas. Und was steht hinter dieser Funktion?
Zitat:

...external user32 name ...
Ob die user32 eine DLL ist? Winowssuche auf und danach suchen.

Somit ist klar, mein Programm für Tastaturhooks verwendet ebenfalls eine DLL. Allerdings ist diese bereits fertig im Windows vorhanden.
Aus dem Grunde habe ich auch in diesem Thread fortgesetzt um das von mir oben beschriebene zu korrigieren.

So, agm65. Eine Funktion für Hooks für die Maus hält die Unit so wie es aussieht nicht bereit.
Aber nun: RegisterHootKey verwendet eine DLL. Was spricht nun noch dagegen die benannte Maus-DLL zu verwenden?

Gruß, Robert

edosoft 22. Mai 2006 14:48

Re: Maus- und Tastaturrecorder
 
Hallo,

ich hab das mal ausprobiert die ganze dll in das programm direkt rein zu implementieren.
allerdings hat das nur bestätigt was ich schon gehört hatte - wenn du einen hook im programm verwendest dann greift er nur auf eben dein programm. als dll hast du aber die möglichkeit einen systemweiten hook zu basteln - und genau das wollen wir ja.
du kommst also bei nem systemweiten hook nicht um die verwendung einer dll rum. (du kannst ja die dll in die exe reinpacken und dann beim start entpacken oder so.)

-dominik


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz