![]() |
Re: Probleme mit Hooks
bin auch grade auf die Spur gekommen, das systemweite Hooks in DLL's müssen.
Okay habe auch ein Beispiel im Netz gefunden von -Assarbad- Danke nochmals MFg Alex |
Re: Probleme mit Hooks
Zitat:
|
Re: Probleme mit Hooks
Liste der Anhänge anzeigen (Anzahl: 1)
da bin ich wieder... :-)
hab jetzt mal versucht den Hook in eine DLL einzubinden. Nur leider weiß ich echt nicht, was ich falsch mache.Das Programm zeigt mir einfach keine X und Y Koordinaten an.Bitte helft mir (klingt ja fast wie: "Bitte melde dich" *ggg*) Wäre echt toll wenn ihr mir ein Rat geben könntet woran es liegt. Source für DLL und Formular liegt bei. Assarbad ich habe nur von deinem Tutorial ein wenig abgespeckt. Ich gebe zu, das der Source von dir stammt :-D MFG Alex |
Re: Probleme mit Hooks
ich wollte mal fragen, wenn ich jetzt ein NICHT-Systemweiten Hook habe, brauche ich den ja nicht in eine DLL einbinden oder?
Funktioniert das, dass ich ein Hook in eine Komponente einbinde? Ich habe es so probiert:
Delphi-Quellcode:
Nur leider kennt er die Variable MouseHook in der Funktion "MouseProc" nicht. Ist ja logisch aber wenn ich die Funktion selber mit in den PRIVATE-Teil schreibe dann meckert der Compiler bei folgender Zeile:
unit HintCheckBox;
interface uses SysUtils, Classes, Controls, StdCtrls, Messages, Windows, Graphics, ExtCtrls; type THintCheckBox = class(TCheckBox) private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } MouseHook : HHOOK; Constructor Create(AOwner:TComponent); override; Destructor Destroy; override; published { Published-Deklarationen } end; function MouseProc(nCode : Integer; wParam: WPARAM; lParam : LPARAM): LRESULT; stdcall; { ---------------------------------------------------------------------------- } procedure Register; { ---------------------------------------------------------------------------- } implementation { ---------------------------------------------------------------------------- } procedure Register; begin RegisterComponents('Beispiele', [THintCheckBox]); end; { ---------------------------------------------------------------------------- } { THintCheckBox } { ---------------------------------------------------------------------------- } function MouseProc(nCode : Integer; wParam: WPARAM; lParam : LPARAM): LRESULT; stdcall; begin case nCode < HC_ACTION of True : Result := CallNextHookEx(MouseHook, nCode, wParam, lParam); else //.....IRGENDWAS Result := CallNextHookEx(MouseHook, nCode, wParam, lParam); end; end; { ---------------------------------------------------------------------------- } constructor THintCheckBox.Create(AOwner: TComponent); begin inherited; MouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadId()); end;
Delphi-Quellcode:
Variable erwartet an der Stelle: @MouseProc
MouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadId());
Ich hoffe ihr könnt mir helfen... MFG Alex |
Re: Probleme mit Hooks
Moin!
Ein Journalhook ist auch systemweit, benötigt aber keine DLL und kann in der Application eingebunden werden. Daher ist das mit der DLL keine zwingende Vorraussetzung. MfG Muetze1 |
Re: Probleme mit Hooks
also ich bin jetzt auf dem Stand, das ich in der Hook-Funktion eine Message an meine Komponente schicken will.Nur leider kenne ich das Handle der Komponente nicht.Könnt ihr mir bitte helfen?
Delphi-Quellcode:
In WM_HINT erfolgt dann meine Auswertung...
unit HintCBx;
interface uses SysUtils, Classes, Controls, StdCtrls, Messages, Windows, Graphics, ExtCtrls; const WM_HINT = WM_USER + 1; type THintCBx = class(TCheckBox) private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } procedure WMHint(var Message: TWMMouseMove); message WM_HINT; Constructor Create(AOwner:TComponent); override; Destructor Destroy; override; published { Published-Deklarationen } end; function MouseProc(nCode : Integer; wParam: WPARAM; lParam : LPARAM): LRESULT; stdcall; var MouseHook : HHOOK; { ---------------------------------------------------------------------------- } procedure Register; { ---------------------------------------------------------------------------- } implementation { ---------------------------------------------------------------------------- } procedure Register; begin RegisterComponents('Beispiele', [THintCBx]); end; { ---------------------------------------------------------------------------- } { THintCBx } { ---------------------------------------------------------------------------- } function MouseProc(nCode : Integer; wParam: WPARAM; lParam : LPARAM): LRESULT; stdcall; begin if (wParam = WM_MOUSEMOVE) then begin if ControlHandle <> 0 then begin //SendMessage(ControlHandle,WM_MOUSEMOVE,wParam,lParam); SendMessage(HANDLE,WM_HINT,wParam,lParam); end; end; Result := CallNextHookEx(MouseHook,nCode,wParam,lParam); end; { ---------------------------------------------------------------------------- } constructor THintCBx.Create(AOwner: TComponent); begin inherited; MouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadId()); end; { ---------------------------------------------------------------------------- } destructor THintCBx.Destroy; begin if MouseHook <> 0 then UnhookWindowsHookEx(MouseHook); inherited; end; Nur ich brauche das Komponenten-Handle für SendMessage?! Hoffe ihr könnt mir helfen MFG Alex |
Re: Probleme mit Hooks
[push!!!]
Hat keiner eine Idee, wie ich an das "Komponenten-handle" herankomme um SendMessage in dem MouseHook zu verwenden?! Ich wäre über jeden Lösungsvorschlag erfreut.... MFG Alex |
Re: Probleme mit Hooks
@Muetze: Journal-Hooks sind aber ursprünglich als Accessibility-Feature gedacht gewesen (also zur Erleichterung für Behinderte), nicht um sie als Maushook zu mißbrauchen. Hooks haben negativen Einfluß auf die Systemperformance (wenn auch nur gering), deshalb sollte man den passenden benutzen.
@Alex: Problem Problem ... du verstehst offenbar noch nicht, wie Klassen im Speicher liegen. Man kann auch statische Funktionen (sowas brauchst du für die Callback) in einem Objekt haben, dies ist aber absolut nicht zu empfehlen. Stattdessen sollte eine Callback-Funktion außerhalb des Objektes liegen und mit dem Objekt über dessen Interfaces kommunizieren. Das Problem mit Methoden von Klassen/Objekten ist, daß man deren Position im Speicher mit @ nicht zuverlässig ermitteln kann! Zitat:
Zitat:
|
Re: Probleme mit Hooks
okay danke @Assarbad...
also ich werde jetzt das CheckBox-Handle "veröffentlichen" und darüber kann ich dann also zugreifen? Ich hoffe das funktioniert so einfach wie es sich anhört :-)) also danke nochmal,werde es dann gleich mal testen MFG Alex |
Re: Probleme mit Hooks
also das Handle lasse ich mir jetzt so geben:
Delphi-Quellcode:
Kann ich da in meinem MouseHook jetzt so darauf zugreifen oder wie mache ich das jetzt?
type
THintCBx = class(TCheckBox) private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } function GetHandle : HWND; //... end; function THintCBx.GetHandle: HWND; begin Result := Self.Handle; end;
Delphi-Quellcode:
MFG Alex
var
Test : THintCBx; begin if (wParam = WM_MOUSEMOVE) then begin if Test.GetHandle <> 0 then begin //SendMessage(ControlHandle,WM_MOUSEMOVE,wParam,lParam); SendMessage(Test.GetHandle,WM_HINT,wParam,lParam); end; end; Result := CallNextHookEx(MouseHook,nCode,wParam,lParam); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 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