![]() |
OnMouseOut-Event
Leider gibt es kein OnMouseOut-Event bei der Form, welches ich mit dem OnMouseOver-Event verknüpfen kann.
Meine Zielsetzung ist es, ein Programmfenster zu haben, welches bemerkt, wann die Mouse außerhalb des Fensters ist, und wann sie wieder darüber (über einer der Komponenten) ist. Ich will ein Fenster haben, was bei MousOut fast ganz transparent ist, aber bei MouseOver wieder sichtbar wird. Weiß jemand, wie ich diese Events erzeugen kann? |
Re: OnMouseOut-Event
Das müsstest du über einen hook realisieren.
Gruß |
Re: OnMouseOut-Event
Hallo Knogge,
was ist ein Hook? Und wie erstelle und nutze ich so einen Hook? |
Re: OnMouseOut-Event
Dieser Hook wird ausgelöst, wenn die Maus bewegt wird:
Delphi-Quellcode:
so wird der hook gestartet:
var
Form1: TForm1; aHook : Cardinal; FHookStarted : Boolean; [...] procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); begin Handled := False; if (Msg.message = WM_CANCELJOURNAL) and FHookStarted then aHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, 0, 0); end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if FHookStarted then UnhookWindowsHookEx(aHook); end; function JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg; Sender: TObject): Integer; stdcall; var aPoint : TPoint; begin Result := CallNextHookEx(aHook, Code, wParam, Longint(@EventStrut)); if Code < 0 then Exit; if Code = HC_SYSMODALON then Exit; if Code = HC_ACTION then begin if (EventStrut.message = WM_MOUSEMOVE) then begin GetCursorPos(aPoint); Form1.Label1.Caption := IntToStr(aPoint.x) + ' ' + IntToStr(aPoint.y) end; end; end;
Delphi-Quellcode:
Du musst jetzt nur noch prüfen, ob sich sich in dem bereich deiner Form befindet oder nicht.
hook starten
if (FHookStarted = false) then begin aHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, hInstance, 0); FHookStarted := True; end; Gruß [Edit]Sorry, hab ein Stückchen Code vergessen[/Edit] |
Re: OnMouseOut-Event
Hier ist ein Link mit Tutor und Source in Deutsch.
![]() |
Re: OnMouseOut-Event
|
Re: OnMouseOut-Event
'n Abend!
Zitat:
@MrKnogge: Hier wäre ein Mouse-Hook (Flag WH_MOUSE) angebracht, erspart auch das GetCursorPos :wink: Grüßle! Edit: Mal auf diesen Thread aufmerksam mache: ![]() |
Re: OnMouseOut-Event
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, danke für Eure Hilfen.
Ich habe den Code von MrKnogge verwendet. Hier mein gegenwärtiges Problem:
Delphi-Quellcode:
Beim Kompilieren gibt es die folgenden Fehler: VARIABLE REQUIRED.
procedure TAlpha.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin Handled:=False; if (Msg.message=WM_CANCELJOURNAL) and FHookStarted then aHook:=SetWindowsHookEx(WH_JOURNALRECORD,@JournalProc,0,0); end; Dieser Fehler taucht in der mit IF beginnenden Zeile auf. Wenn es okay mit Euch ist, kann ich den gesamten Code mal in eine ZIP order RAR packen und Euch zur Verfügung stellen. Meine Absicht ist, den TimerDown auszulösen, sobald die Mouse außerhalb des Fensters ist, und den Timer Up auszulösen, sobald die Mouse über dem Fenser ist. |
Re: OnMouseOut-Event
Nimm für die ApplicationEvents mal die gleichnamige Komponente unter "Zusätzliches".
Gruß [Add] Aber um auf den eigentlichen Fehler zu kommen, da bin ich noch auf der Suche. Ich habe bei deinem Projekt das gleiche Problem, aber sehe keinen Unterschied zu meinem Code. |
Re: OnMouseOut-Event
Versuche es mal hiermit:
Delphi-Quellcode:
Die Function JournalProc muss wohl global sein, sie war bei dir unter der Klasse TAlpha eingetragen.
function JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg; Sender: TObject): Integer; stdcall;
var aPoint: TPoint; begin Result:=CallNextHookEx(aHook, Code, wParam, Longint(@EventStrut)); if Code<0 then Exit; if Code=HC_SYSMODALON then Exit; if Code=HC_ACTION then begin if (EventStrut.message=WM_MOUSEMOVE) then begin GetCursorPos(aPoint); Alpha.Label1.Caption:=IntToStr(aPoint.x)+' '+IntToStr(aPoint.y) end; end; end; procedure TAlpha.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); begin Handled:=False; if (Msg.message=WM_CANCELJOURNAL) and FHookStarted then aHook:=SetWindowsHookEx(WH_JOURNALRECORD,@JournalProc,0,0); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 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