Mausposition Systemweit abfragen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Mausposition Systemweit abfragen

Beitrag von compmgmt »

Hallo,
Ich möchte eine Form (ist ein extra Programm) an der Position des Mauszeigers starten. Mouse.GetMouseX; bzw. mit Y oder auch GetCursorPos gibt nur die Position relativ zur Form aus, das bringt mir natürlich nichts :/

System: Windows XP Professional SP3


Vielen Dank für eine Antwort im Vorraus.

Mit freundlichen Grüßen
compmgmt

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Mausposition Systemweit abfragen

Beitrag von theo »

Code: Alles auswählen

procedure TForm1.FormShow(Sender: TObject);
var P:TPoint;
begin
 P:=ClientToScreen(Mouse.CursorPos);
 Left:= P.X;
 Top:= P.Y;
end;       
Seit wann schreibt man eigentlich "im Voraus" mit zwei "r"?
Das lese ich immer öfter.

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Mausposition Systemweit abfragen

Beitrag von wp_xyz »

compmgmt hat geschrieben:Mouse.GetMouseX; bzw. mit Y oder auch GetCursorPos gibt nur die Position relativ zur Form aus
Wo hast du das denn her?

Mach dir ein neues Projekt, setze ein Label und einen Timer drauf, gib dem Timer ein kurzes Interval von etwa 10 ms und weise ihm folgenden OnTimer-Eventhandler zu:

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := Format('x = %d, y = %d', [Mouse.CursorPos.X, Mouse.CursorPos.Y]);
end; 
Bewege die Maus in die linke obere Bildschirmecke - was zeigt das Label an?

Unabhängig davon kann man control-relative Punkt-Koordinaten in bildschirm-relative Koordinaten umwandeln mit ClientToScreen(P:TPoint) (bzw. umgekehrt mit ScreenToClient(P:TPoint)).

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Mausposition Systemweit abfragen

Beitrag von compmgmt »

theo hat geschrieben:Seit wann schreibt man eigentlich "im Voraus" mit zwei "r"?
Das lese ich immer öfter.
"Voraus" ist richtig, das war ein Tippfehler ^^

Aber trotzdem funktioniert das nur halb...

Kurze Zusatzinfo: Ich habe eine DLL die ein Forumlar aufruft.
Wenn ich in der Unit des Formulars beim Event "OnShow" oder bei einem Button "OnClick" diesen Befehl aufrufe, kommt eine Fehlermeldung "access-violation". Natürlich rufe ich die DLL über ein anderes Programm dynamisch auf, dadurch kann ich das ganze nicht debuggen :/

Hier der Code. Ich musste "CursurPos" austauschen, da dies anscheinend nicht mehr existiert :o

Code: Alles auswählen

procedure TWnd_A.Button1Click(Sender: TObject);
var
  P: TPoint;
begin
  P := ClientToScreen(Point(Mouse.GetMouseX, Mouse.GetMouseY));
  Wnd_A.Left:= P.X;
  Wnd_a.Top:= P.Y;
end;

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Mausposition Systemweit abfragen

Beitrag von compmgmt »

wp_xyz hat geschrieben:
compmgmt hat geschrieben:Mouse.GetMouseX; bzw. mit Y oder auch GetCursorPos gibt nur die Position relativ zur Form aus
Wo hast du das denn her?

Mach dir ein neues Projekt, setze ein Label und einen Timer drauf, gib dem Timer ein kurzes Interval von etwa 10 ms und weise ihm folgenden OnTimer-Eventhandler zu:

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := Format('x = %d, y = %d', [Mouse.CursorPos.X, Mouse.CursorPos.Y]);
end; 
Bewege die Maus in die linke obere Bildschirmecke - was zeigt das Label an?

Unabhängig davon kann man control-relative Punkt-Koordinaten in bildschirm-relative Koordinaten umwandeln mit ClientToScreen(P:TPoint) (bzw. umgekehrt mit ScreenToClient(P:TPoint)).
Mouse.CursorPos.X Gibt es nicht. P.S.: Ich hab Lazarus 1.4.0

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mausposition Systemweit abfragen

Beitrag von Mathias »

Mouse.CursorPos.X Gibt es nicht. P.S.: Ich hab Lazarus 1.4.0
Bei mir geht es, habe Lazarus 1.6 .
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Mausposition Systemweit abfragen

Beitrag von compmgmt »

Mathias hat geschrieben:
Mouse.CursorPos.X Gibt es nicht. P.S.: Ich hab Lazarus 1.4.0
Bei mir geht es, habe Lazarus 1.6 .
Jo, kann gut sein, dass es daran liegt. Aber ich habe das ganze jetzt anders gelöst, da ich es sogar besser ist, wenn ich die Form nicht an der Mauszeigerposition anzeige. Sieht besser aus. Trotzdem danke für eure Hilfe :D

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Antworten