![]() |
Re: Probleme mit Hooks
Also das mit dem Kapseln in der Funktion ist schonmal richtig. Aber ob du direkt vom Hook aus darauf zugreifen kannst, weiß ich nicht. Der Normale Weg sollte ja sein, daß der Hook unabhängig von Code in einer Anwendung ist. Zumindest weitgehend. Also würde ich zB innerhalb der DLL immer während der Initialisierung eine Variable mit dem Fensterhandle setzen - danach dann auf diese lokale Variable zugreifen. Meinetwegen noch mit Checks wie: IsWindow(hWindowHandle) ...
|
Re: Probleme mit Hooks
ich dachte, ich brauche keine DLL?!
Ich habe doch nur in der Komponente den MouseHook und ich brauche ihn ja auch nur dort.Daher wäre eine DLL nicht angebracht (denke ich zumindest...). Ich weiß auch noch nicht so ganz wie ich daran komme... Ich kannte mal eine Funktion, die mir glaube ich ein TControl zurückgibt, wo sich die Maus grade darüber befindet.Nur weiß ich nicht mehr wie die hieß.... MFG Alex |
Re: Probleme mit Hooks
Ist ja korrekt, du brauchst auch keine DLL. Ich kenne aber deine Implementierung nicht, daher kann ich ja nur mutmaßen.
|
Re: Probleme mit Hooks
ich habe doch oben den kompletten source stehen...
Ich werde ihn nochmal Posten:
Delphi-Quellcode:
In der MouseProc experiementiere ich grade noch rum, daher geht das nicht zu compilieren...
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 } HintWnd : THintWindow; protected { Protected-Deklarationen } public { Public-Deklarationen } function GetHandle : HWND; procedure WMHint(var Message: TWMMouseMove); message WM_HINT; Constructor Create(AOwner:TComponent); override; Destructor Destroy; override; procedure Loaded; 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; var MPos : TPoint; Komp : TControl; begin if (wParam = WM_MOUSEMOVE) then begin GetCursorPos(MPos); Komp := FindDragTarget(MPos, True); 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); end; { ---------------------------------------------------------------------------- } constructor THintCBx.Create(AOwner: TComponent); begin inherited; HintWnd := THintWindow.Create(Self); HintWnd.Color := clInfoBk; ShowHint := True; MouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadId()); end; { ---------------------------------------------------------------------------- } destructor THintCBx.Destroy; begin HintWnd.Free; if MouseHook <> 0 then UnhookWindowsHookEx(MouseHook); inherited; end; { ---------------------------------------------------------------------------- } function THintCBx.GetHandle: HWND; begin Result := Self.Handle; end; { ---------------------------------------------------------------------------- } procedure THintCBx.Loaded; begin Inherited Loaded; if ComponentState = [csDesigning] then Exit; end; { ---------------------------------------------------------------------------- } procedure THintCBx.WMHint(var Message: TWMMouseMove); var rec : TRect; MPos: TPoint; tmpHint : String; begin if Assigned(HintWnd) then begin tmpHint := Hint; GetCursorPos(MPos); MPos := ScreenToClient(MPos); rec := Rect(Self.Left, Self.Top, Self.Left + Self.Width, Self.Top + Self.Height); if (PtInRect(rec, point(MPos.X + Self.Left, MPos.Y + Self.Top))) and (not Self.Enabled) and (Self.ShowHint) then begin GetCursorPos(MPos); HintWnd.Color := clInfoBk; HintWnd.ActivateHint(Rect(MPos.X + 15, MPos.Y, MPos.X + 20 + HintWnd.Canvas.TextWidth(tmpHint), MPos.Y + 15), tmpHint); end else HintWnd.ReleaseHandle; end; Message.Result := 1; end; { ---------------------------------------------------------------------------- } { ---------------------------------------------------------------------------- } end. Ich brauche dieses Handle der Komponente... MFG Alex |
Re: Probleme mit Hooks
also wie gesagt, ich brauche in der MouseProc nur das Handle damit ich meine Komponente informieren kann...
Die Komponente wertet dann die Werte aus :-) Hoffe du kannst mir helfen Assarbad... MFG Alex |
Re: Probleme mit Hooks
Immer mit der Ruhe, ein alter Mann ist kein D-Zug ;) ... ich schau vermutlich am späten Nachmittag mal drauf. Hab schließlich auch andere Sachen zu tun.
|
Re: Probleme mit Hooks
ja ist okay, wollte dich nicht hetzen :-)
bis dann, alex |
Re: Probleme mit Hooks
Tja, zum eigentlichen Problem (Callback als Methode) gibt es hier einen schönen Artikel:
![]() Laut Implementierung in Forms.pas könnte man das auch an deinen Fall anpassen. Fehlt mir aber aktuell die Zeit für solche Späßchen. Die relevanten Funktionen aus Forms.pas sind: function MakeObjectInstance(Method: TWndMethod): Pointer; procedure FreeObjectInstance(ObjectInstance: Pointer); Problem sind Kleinigkeiten in der Implementierung und der Typ "TWndMethod" ... die angepaßt werden müssten. TWndMethod hat nämlich 4 Parameter + Rückgabe ... eine HookProc nur 3 + Rückgabe. |
Re: Probleme mit Hooks
okay danke @Assarbad
werde es bei gelegenheit mal probieren. Ich dachte, dass Problem sei einfacher zu lösen :-)))) aber naja ich werde mich da mal reinfitzen. Danke nochmals. Schön Tag noch MFG Alex |
Re: Probleme mit Hooks
Du bekommst die Mausposition nicht angezeigt weil die DLL in jedes Programm eingebunden wird. Das heißt die DLL wird merhmals geladen. Somit musst du in der DLL die Informationen erst zu deiner Anwendung schicken (welche du natürlich davor erstmal finden musst)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 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