Autor Beitrag
fidionael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: 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.

ausblenden volle Höhe Quelltext der MyHook.dll
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.


ausblenden volle Höhe Quelltext des Projektes
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



BeitragVerfasst: 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
ausblenden 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? :roll:
fidionael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: Di 11.07.06 12:40 
user profile iconLuckie 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?



user profile iconLuckie hat folgendes geschrieben:
Und das
ausblenden 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? :roll:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: Di 11.07.06 13:32 
Ich habe nun schon so ziemlich alles ausprobiert:

ausblenden Delphi-Quelltext
1:
Result:=CallNextHookEx(HookHandle,Code,0,0);					

ausblenden Delphi-Quelltext
1:
Result:=CallNextHookEx(HookHandle,HC_NOREMOVE,VirtKey,KeyStroke);					

ausblenden 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



BeitragVerfasst: Mi 12.07.06 02:12 
Hier: www.michael-puff.de/...hi/Importe/Assarbad/ gibt es ein Hook-Tutorial.