| Autor |
Beitrag |
fidionael
      
Beiträge: 232
Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
|
Verfasst: Di 11.07.06 02:25
Hallo, ich versuche gerade mich wieder ein wenig mit der Materie der Hooks vertraut zu machen, doch meine Hooks funktionieren bisher überhaupt nicht. Ich habe an Hand diverser Tutorials gearbeitet und vermutlich irgendwo einen kleinen Fehler oder etwas vergessen. Vielleicht kann mir ja hier geholfen werden.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| library MyHook;
uses Windows, Messages;
var HookHandle: Cardinal = 0; WindowHandle: Cardinal = 0;
function MyHookProc(Code, VirtKey, KeyStroke: Integer) : LRESULT; stdcall; begin Result:=0; end;
function InstallHook(Hwnd: Cardinal) : Boolean; stdcall; begin Result:=False; if HookHandle = 0 then begin HookHandle:=SetWindowsHookEx(WH_KEYBOARD,@MyHookProc,hInstance,0); WindowHandle:=Hwnd; Result:=True; end; end;
function UninstallHook : Boolean; stdcall; begin Result:=UnhookWindowsHookEx(HookHandle); HookHandle:=0; end;
exports InstallHook, UninstallHook; end. |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
function InstallHook(Hwnd: THandle) : Boolean; stdcall; external 'MyHook.dll'; function UninstallHook : Boolean; stdcall; external 'MyHook.dll';
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Application.Minimize; if InstallHook(Handle) then ShowMessage('Hook installiert'); end;
procedure TForm1.FormDestroy(Sender: TObject); begin UninstallHook; end;
end. |
Wie hoffentlich erkennbar ist, soll mein Hook zunächst mal alle Tastendrücke abfangen.
Schonmal vielen Dank für die Hilfe. Mfg
Edit1:
Die Anweisung Application.ShowMainForm:=False wurde mit Application.Minimize ersetzt.
Zuletzt bearbeitet von fidionael am Di 11.07.06 12:42, insgesamt 1-mal bearbeitet
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 11.07.06 02:38
Und woher weißt du, dass er nicht funktioniert, wenn du nur null zurückgibst und sonst nichts machst?
Und das
Delphi-Quelltext 1:
| Application.ShowMainForm:=False; |
mag ich, glaube ich, gar nicht im Zusammenhang mit einem Tastatur-Hook. Oder hat das einen tieferen Sinn warum das Fenster nicht zu sehen ein darf, wenn du dich nur etwas mit Hooks vertraut machen willst? 
|
|
fidionael 
      
Beiträge: 232
Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
|
Verfasst: Di 11.07.06 12:40
Luckie hat folgendes geschrieben: | | Und woher weißt du, dass er nicht funktioniert, wenn du nur null zurückgibst und sonst nichts machst? |
Hm, da muss ich wohl was falsch verstanden haben - ich dachte wenn ich den Hook installiert habe und eine Taste gedrückt wird, wird meine Hook-Procedure aufgerufen und wenn diese den Tastendruck nicht via CallNextHookEx weiterschickt, wird dieser verschluckt?
Luckie hat folgendes geschrieben: | Und das
Delphi-Quelltext 1:
| Application.ShowMainForm:=False; |
mag ich, glaube ich, gar nicht im Zusammenhang mit einem Tastatur-Hook. Oder hat das einen tieferen Sinn warum das Fenster nicht zu sehen ein darf, wenn du dich nur etwas mit Hooks vertraut machen willst?  |
Keine Angst, ich möchte keinen Keylogger oder ähnliches schreiben, aber da ich ja hier nur Aktivität der Tastatur in anderen Fenstern einschränken wollte, ohne in meinem Formular etwas zu tun, habe ich meins einfach unsichtbar gemacht.
Du hast aber Recht, vielleicht wäre es die bessere und unverfänglichere Variante, das Fenster bei Programmstart nur zu minimieren. Dann muss man das Programm auch nicht immer via TaskManager beenden 
|
|
fidionael 
      
Beiträge: 232
Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
|
Verfasst: Di 11.07.06 13:32
Ich habe nun schon so ziemlich alles ausprobiert:
Delphi-Quelltext 1:
| Result:=CallNextHookEx(HookHandle,Code,0,0); |
Delphi-Quelltext 1:
| Result:=CallNextHookEx(HookHandle,HC_NOREMOVE,VirtKey,KeyStroke); |
Delphi-Quelltext 1: 2: 3: 4:
| type TPMsg = ^TMsg;
TPMsg(KeyStroke)^.Message := WM_NULL; Result:=CallNextHookEx(HookHandle,Code,VirtKey,KeyStroke); |
Aber es passiert einfach gar nichts  Kann mir das jemand erklären oder mir zumindest ein kurzes Beispiel geben wie man Eingaben blocken kann?
Edit1:
Ich habe nun mal in der Hook-Prozedur eine Message an meine Anwendung schicken lassen ( PostMessage(WindowHandle,WM_USER+1337,VirtKey,KeyStroke);). Diese kann ich auch in meiner Anwendung abfangen, aber das funktioniert nur in einem Memo innerhalb meines Formulares und hierfür brauch ich ja keine Hooks...
Kann mir bitte jemand helfen? Ich verzweifle hier 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 12.07.06 02:12
|
|
|