![]() |
Ermitteln ob die Maus auf der Form ist?
Hi Alle.
wie kan man ermitteln ob die Maus noch im Fenster oder ausserh. des Fensters ist? |
AW: Ermitteln ob die Maus auf der Form ist?
Wenn sie außerhalb ist, bekommst Du normalerweise keine MouseMove-Nachrichten.
|
AW: Ermitteln ob die Maus auf der Form ist?
... Die bekommt man aber auch nicht wenn man mit der Maus nicht direkt auf dem Formular ist sondern auf nem Button oder so. Im Zweifelsfall GetCursorPos + ein paar Berechnungen.
|
AW: Ermitteln ob die Maus auf der Form ist?
Ja, aber ich möchte das gern von mein Programm aus ermitteln.
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
![]() |
AW: Ermitteln ob die Maus auf der Form ist?
Du meinst vermutlich ScreenToClient(Mouse.CursorPos). Andererseits gibt es ja auch Ereignisse für das Überfahren/Verlassen des Formulars.
|
AW: Ermitteln ob die Maus auf der Form ist?
Vielleicht hilft ja auch mein Google-Such-Egebnis
![]() ![]() |
AW: Ermitteln ob die Maus auf der Form ist?
Verlassen des Formulars wäre wichtig!
|
AW: Ermitteln ob die Maus auf der Form ist?
Eigentlich sollte da OnMouseLeave feuern.
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
AW: Ermitteln ob die Maus auf der Form ist?
Hast Du evtl. ein Panel oder einen sonstigen Container mit alClient auf dem Formular?
|
AW: Ermitteln ob die Maus auf der Form ist?
Also da hilft wohl nur ein MouseHook
![]() Die Schweizer haben da einen Ansatz ![]() |
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
AW: Ermitteln ob die Maus auf der Form ist?
Dann wird dessen OnMouseLeave ausgelöst. Da du nicht auf dem Formular direkt bist, wird nicht dessen Ereignis ausgelöst.
Du müsstest aber die WndProc überschreiben und die Message dort abfangen können nehme ich an. |
AW: Ermitteln ob die Maus auf der Form ist?
Klappt es in dessen OnMouseLeave?
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
AW: Ermitteln ob die Maus auf der Form ist?
Dann weiß ich auch nicht weiter, bei mir geht es.
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
![]() ![]() Manchmal darf man nicht nur auf die Maus hören, sondern nur auf den Eingabefokus. Wenn mir die Maus, bei der Eingabe, im Weg ist, dann verschiebe ich sie und passe dabei nicht auf, ob sie noch über der Form bleibt. |
AW: Ermitteln ob die Maus auf der Form ist?
Ich verstehe nicht ganz, was OnDeactivate mit OnMouseLeave zu tun haben soll :gruebel:
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
AW: Ermitteln ob die Maus auf der Form ist?
TApplicationEvents auf das Formular --> OnMessage:
Delphi-Quellcode:
Zum Testen schreibt das einfach etwas in die Caption.
procedure TForm257.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var ClientRectAbs: TRect; begin if Msg.message = WM_MOUSELEAVE then begin ClientRectAbs.TopLeft := ClientToScreen(ClientRect.TopLeft); ClientRectAbs.BottomRight := ClientToScreen(ClientRect.BottomRight); InflateRect(ClientRectAbs, -2, -2); if not PtInRect(ClientRectAbs, Mouse.CursorPos) then Caption := Caption + 'AA'; end; end; |
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
Eine Abfrage würde so aussehen:
Delphi-Quellcode:
und in deinem Projekt dann so:
function MouseOverWindow( aHandle : HWND ) : Boolean;
var wndHandle : HWND; begin wndHandle := WindowFromPoint( Mouse.CursorPos ); while ( wndHandle <> 0 ) and ( wndHandle <> aHandle ) do begin wndHandle := GetParent( wndHandle ); end; Result := ( wndHandle <> 0 ); end;
Delphi-Quellcode:
procedure TForm1.Timer1Timer( Sender : TObject );
begin // Wir nehmen das Handle dieser Form if MouseOverWindow( Self.Handle ) then Caption := 'ja' else Caption := 'false'; end; |
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
AW: Ermitteln ob die Maus auf der Form ist?
Dann passt mein Quelltext ja. Fehlt nur zusätzlich noch die Prüfung auf WM_MOUSEMOVE um ggf. die Farbe zu ändern und in dem obigen Code kannst du sie zurück ändern.
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
Delphi-Quellcode:
wird auch dann gesendet, wenn man von der Form auf ein anderes Control wechselt.
WM_MOUSELEAVE
Wenn die Maus dann passend stehen bleibt, kommt auch kein passendes
Delphi-Quellcode:
.
WM_MOUSEMOVE
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
Zweitens, wird (wenn es denn funktioniert, z.B. mit Delphi XE) die Kopfzeile der Form bereits als außerhalb der Form gewertet. Nicht sehr sinnvoll. Die einzig verlässliche Vorgehensweise ist also die per Funktion MouseOverWindow(), wie beschrieben. Ich selbst hätte den Mausstatus der Form mit Hilfe der beiden Messages CM_MOUSEENTER und CM_MOUSELEAVE abgefangen sowie dann ebenfalls mittels Timer behandelt, aber die Funktion MouseOverWindow() ist zweifelsohne eleganter. |
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
Richtig, es wird genau das gemacht was ich mache... Beim ersten WM_MOUSEMOVE wird CM_MOUSEENTER ausgelöst, bei WM_MOUSELEAVE wird CM_MOUSELEAVE ausgelöst. Zitat:
Delphi-Quellcode:
Einen Timer braucht man aber trotzdem nicht...
procedure TForm19.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var ClientRectAbs: TRect; begin if Msg.message = WM_MOUSELEAVE then begin ClientRectAbs.TopLeft := ClientToScreen(ClientRect.TopLeft); ClientRectAbs.BottomRight := ClientToScreen(ClientRect.BottomRight); InflateRect(ClientRectAbs, -2, -2); if not PtInRect(ClientRectAbs, Mouse.CursorPos) or (WindowFromPoint(Mouse.CursorPos) <> Handle) then Color := clBtnFace; end else if Msg.message = WM_MOUSEMOVE then Color := clRed; end; |
AW: Ermitteln ob die Maus auf der Form ist?
Nenn mich Erbsenzähler, aber das gibt ein schönes Geflacker, wenn du mit diesem Code
Delphi-Quellcode:
über irgendein Control auf der Form entlangfährst. Denn jedes Control hat ein eigenes Handle ;)
if not PtInRect(ClientRectAbs, Mouse.CursorPos) or (WindowFromPoint(Mouse.CursorPos) <> Handle) then
Es müsste also die Abfrage aus meiner Funktion - oder einfach die Funktion selber - eingebaut werden :) |
AW: Ermitteln ob die Maus auf der Form ist?
Stimmt. Darauf habe ich jetzt nicht geachtet, weil ich mich gerade sehr an dem Timer gestört hatte.
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
Da kommen sie her (komplettes Beispiel):
Code:
Und damit funktioniert es - anders als mit dem ApplicationEvent - perfekt auch unter Delphi 7, und zudem wird auch die Kopfzeile der Form als Bestandteil der Form erkannt, und es ist egal, ob und welche Komponente (z.B. ein Panel) auf der Form plaziert ist.
type
TForm1 = class(TForm) Panel1: TPanel; Timer1: TTimer; Label1: TLabel; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); protected private { Private-Deklarationen } isMouseOnForm: Boolean; changed: Boolean; procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE; public { Public-Deklarationen } end; Implementation const cMouseOnForm = 'Mouse on form'; cMouseOutOfForm = 'Mouse outside of form'; procedure TForm1.CMMouseEnter(var msg: TMessage); begin isMouseOnForm := true; label1.caption := cMouseOnForm; changed := true; end; procedure TForm1.CMMouseLeave(var msg: TMessage); begin isMouseOnForm := false; label1.caption := cMouseOutOfForm; changed := true; end; procedure TForm1.FormCreate(Sender: TObject); begin panel1.Caption := ''; label1.Caption := ''; timer1.interval := 100; // oder nach Bedarf end; procedure TForm1.Timer1Timer(Sender: TObject); begin // "changed"- Abfrage nur, um unnötige Aktionen zu vermeiden if changed then begin changed := false; label1.invalidate; // oder was auch immer nötig: if isMouseOnForm then MachDies() else MachDas(); end; end; |
AW: Ermitteln ob die Maus auf der Form ist?
Warum nicht einfach WindowFromPoint ?
GetCursorPos in verbindung mit WindowFromPoint Wenn beim Loslassen des Button (oder was auch immer ein HWND/THandle besitzt) das HWND vom WindowFromPoint das gleiche wie mein Handle des Button ist Ergebnis true andernfalls false UPS: Sehe gerade hatte Sir Rufo ja schon geschrieben. gruss |
AW: Ermitteln ob die Maus auf der Form ist?
Probier das mal aus. Sollte eigentlich das sein was du brauchst:
Delphi-Quellcode:
procedure TForm1.FormDeactivate(Sender: TObject);
begin ReleaseCapture; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if GetCapture = 0 then SetCapture(Handle); if PtInRect(BoundsRect, ClientToScreen(Point(x, y))) then Caption := 'Maus ist über der Form' else Caption := 'Maus ist außerhalb der Form'; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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