Geschriebenes aufzeichnen

Hi

Wir haben in der schule schon länger was mit files und so gemacht und eben dann auch , das man Texte in ein edit fenster schreibt und beim klick auf nen Button in eine Datei gespeichert wird.

Jetzt würde mich nur mal interessieren wie man es machen könnte, dass das Programm praktisch im Hintergrund läuft, also nicht direkt angewählt ist, und wenn man dann z.b. auf der tastatur „rumklimpert“, er alles praktisch wie vorher " aufzeichnet" und beim drücken auf die ENTER Taste, das ganze wieder normale in eine gewünschte Datei abspeichert.

Wäre toll, wenn ihr ein paar tipps oder vorschläge hättet.
tschau

Hinweis 1: es gibt unter Windows die Möglichkeit systemweiter „Hooks“, u.a. auch um für jeden Tastendruck eine selbstdefinierte Routine aufzurufen. Das steigt allerdings ziemlich tief in die Systemprogrammierung ein, Näheres müsste unter dem Stichwort Hook in der Win32-Dokumentation zu finden sein.

Hinweis 2: Keyboard-Logger können vernünftigen Zwecken dienen, aber auch (meistens) zum Passwort-Diebstahl oder zur heimlichen Überwachung von Mitarbeitern. Das Ganze bewegt sich also am Rand der Legalität, und brauchbare Schutzprogramme sollten Keyboard-Logger abblocken.

Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo, wie mein Vorredner schon erwähnte, sind Keylogger nicht unbedingt beliebt unter normalen Usern. Dennoch hier ein Beispielcode
library hooker;

var 
hMouseHook : Integer;
hKeyHook : Integer;
Hooked: Boolean;

////////////////////////////////////////////////////////////////////////////////////////////////
/// Eigentliche MouseHookFunktion
////////////////////////////////////////////////////////////////////////////////////////////////
function MouseHookProc(Code, wParam: Integer; var MouseStrut: TMOUSEHOOKSTRUCT): Integer; stdcall;
begin

 //Hier kann ich machen was ich gerne möchte
 TuWas

 //Nachricht weiterschicken und nächsten Hook aufrufen
 Result := 1;
 Result:=CallNextHookEx(hMouseHook, Code, wParam, Integer(@MouseStrut));
end;

////////////////////////////////////////////////////////////////////////////////////////////////
/// Eigentliche KeyboardHookFunktion
////////////////////////////////////////////////////////////////////////////////////////////////
function KeyHookProc(Code, VirtualKey, KeyStroke: Integer): Integer; stdcall;
begin
 result:=0;
 //Passiert etwas ?
 if (Code = HC\_ACTION)then
 begin
 TuSachen
 end;
 //Nachricht weiterschicken
 CallNextHookEx(hKeyHook, Code, VirtualKey, KeyStroke);
end;

////////////////////////////////////////////////////////////////////////////////////////////////
/// Hooking starten
////////////////////////////////////////////////////////////////////////////////////////////////
function StartHook: Byte; export;
begin
 Result := 0;
 if Hooked then
 begin
 Result := 1;
 Exit;
 end;

 //Hooks setzen
 hMouseHook := SetWindowsHookEx(WH\_MOUSE , @MouseHookProc, hInstance, 0);
 hKeyHook := SetWindowsHookEx(WH\_KEYBOARD, @KeyHookProc, hInstance, 0);

 if hMouseHook \> 0 then
 begin
 Hooked := True;
 end
 else
 begin
 Result := 2;
 end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////
/// Hooking beenden
////////////////////////////////////////////////////////////////////////////////////////////////
function StopHook: Boolean; export;
begin
 if Hooked then
 begin
 Result := UnhookWindowsHookEx(hMouseHook);
 Result := UnhookWindowsHookEx(hKeyHook);
 end
 else
 begin
 Result := True;
 Hooked := False;
 end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////
/// DLL Starten
////////////////////////////////////////////////////////////////////////////////////////////////
procedure DLLStart(dwReason: Cardinal);
begin
 if (dwReason = Dll\_Process\_Detach) then
 begin
 UnhookWindowsHookEx(hMouseHook);
 UnhookWindowsHookEx(hKeyHook);
 end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////
/// Hauptfunktion
////////////////////////////////////////////////////////////////////////////////////////////////
begin
 Hooked := False;
 hMouseHook := 0;
 hKeyHook:=0;
 DLLProc := @DLLStart;
 DLLStart(Dll\_Process\_Attach);
end.

Das ganze muß in eine DLL. Dann kann diese geladen werden und der Hook funktioniert Systemweit. Aber Vorsicht, ein Fehler im Speicher oder mit offenen Handles etc. und das System schmiert gnadenlos ab (zum Glück).
Natürlich gilt, was für alle DLLs gilt :
keine Strings ohne Memorymanager, alles als StdCall etc.

Mfg

Sven