Entwickler-Ecke
Windows API - Mein erster Hook und nichts passiert :(
MCQ - Sa 22.10.05 17:21
Titel: Mein erster Hook und nichts passiert :(
Ich wollte mich heute mal mit dem Thema Hooks auseinandersetzen. Ich fand auch einige Tutorials dazu. Laut diesen sollte folgender Code bei jedem klick mit der linken Maustaste eine Message ausgeben. Es tut sich allerdings gar nichts. Ich hab auch mal einen Brakepoint auf die Funktion "UnsereMouseFunktion" gesetzt. Aufgerufen wird sie nicht :(
Delphi-Quelltext
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: 39: 40: 41: 42: 43: 44: 45: 46:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private public end;
var Form1: TForm1; hMouseHook:HHOOK;
implementation
{$R *.dfm}
function UnsereMouseFunktion(nCode: integer; wparam: WPARAM; lParam: LPARAM):Integer; stdcall; begin if(wParam = WM_LBUTTONDOWN) then ShowMessage('Linke Maustaste gedrückt!'); Result := CallNextHookEx(hMouseHook, nCode, wParam, lParam); end;
procedure TForm1.FormCreate(Sender:TObject); begin hMouseHook := SetWindowsHookEx( WH_MOUSE , UnsereMouseFunktion, 0, 0);
end;
procedure TForm1.FormDestroy(Sender: TObject); begin UnhookWindowsHookEx(hMouseHook); end;
end. |
Ich bin für jegliche Hilfe dankbar
Gruß
MCQ
Christian S. - Sa 22.10.05 17:22
Hallo,
bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den
Richtlinien [
http://www.entwickler-ecke.de/richtlinien.html]:
1.2 Beiträge: |
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...] |
Einfach oben bei Deinem ersten Beitrag auf

klicken und den Titel ändern. Dank Dir!
Viele Grüße,
Christian S.
MCQ - Sa 22.10.05 17:31
Sorry wenn der Name des Themas immernoch nicht besser ist, aber was besseres viel mir nun wirklich nicht ein. Wüsste ich wo genau das Problem liegt müsste ich wahrscheinlich nicht fragen sondern würde googlen. Ich kann aber nunmal nicht mehr sagen kann als das das Ding nicht läuft.
uall@ogc - Sa 22.10.05 17:41
den code musst du in einer dll auslagern, such mal bei google nach "assarbad" und "tastaturhook"
MCQ - Sa 22.10.05 18:16
Habs in einer DLL ausgelagert. Resultat ist folgendes:
Delphi-Quelltext
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: 39: 40: 41: 42: 43:
| library Hook;
uses SysUtils, Classes, Windows, Messages, Dialogs;
var HookHandle:Cardinal=0; {$R *.res}
function UnsereMouseFunktion(nCode: integer; wparam: WPARAM; lParam: LPARAM):Integer; stdcall; begin if(wParam = WM_LBUTTONDOWN) then ShowMessage('Linke Maustaste gedrückt!'); Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); end;
Function StartHook():boolean; begin Result:=false; if HookHandle <> 0 then exit; HookHandle:=SetWindowsHookEx( WH_GETMESSAGE , @UnsereMouseFunktion, 0, 0); Result:=true; end;
Function EndHook():boolean; begin Result:=false; if HookHandle = 0 then exit; UnhookWindowsHookEx(HookHandle); HookHandle:=0; end;
exports StartHook, EndHook;
end. |
Problem bei der Sache. Es funktioniert genausowenig. Die Procedure StartHook liefert das Resultat true, aber selbst wenn ich eine MessageBox in UnsereMouseFunktion implementiere die keinerlei if-Anweisung bedarf passiert rein gar nichts.Das Tutorial von assarbad bin ich grad am lesen, scheint aber das selbe drin zu stehen wie in den anderen auch.
uall@ogc - Sa 22.10.05 18:22
bei
http://assarbad.net/en/stuff/tutorials/hooks/ ist auf jedenfall eine funktionierende lösung
z.b. darfst du wenn nCode > 0 ist glaub ich nicht die CallNextHookEx aufrufen aber das siehste da schon
MCQ - Sa 22.10.05 18:41
Also jetzt versteh ich nix mehr. Ich habe die StartHook-Funktion mal nen bisschen geändert, so das mir HookHandle ausgegeben wird. HookHandle ist auch nach ausführung der SetWindowsHookEx-Funktion noch 0. Irgendwas mach ich falsch, ich hab nur noch nicht rausgefunden was :(
MCQ - Sa 22.10.05 18:45
Hab einfach mal
Delphi-Quelltext
1:
| HookHandle:=SetWindowsHookEx( WH_MOUSE , @UnsereMouseFunktion, 0, 0); |
in
Delphi-Quelltext
1:
| HookHandle:=SetWindowsHookEx( WH_MOUSE , @UnsereMouseFunktion, HInstance, 0); |
geändert und schon funktioniert es offenbar. Allerdings scheint der Hook nun nur ein Lokaler zu sein, ich wollte aber einen globalen schreiben :(
MCQ - Sa 22.10.05 19:26
Problem gelöst, mein erster Hook läuft *stolz is*
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!