Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Mausposition auslesen

Frage Entwicklung Pascal und Delphi

Mitglied: AnkhMorpork

AnkhMorpork (Level 2) - Jetzt verbinden

24.09.2014 um 08:13 Uhr, 3341 Aufrufe, 9 Kommentare

Hallo Experts,

vielleicht kann mich ein Pascal-Kundiger in die richtige Richtung schupsen. Habe wie ein Besengter gegoogelt, aber bewege mich da ständig im Kreis.

Ich benutze den FreePascal-Compiler 2.6.4 mit einer Lazarus-IDE.

Ich brauche die aktuelle Mausposition, und zwar die Bildschirmkoordinaten, nicht die Formularkoordinaten. Ich habe das mit
Mouse.CursorPos.X / Mouse.CursorPos.Y
im Mousemove-Handler probiert, aber dat lüppt nich. Ich bekomme zwar die Koordinaten, aber nur solange sich die Maus innerhalb des Formularfensters bewegt - ist auch klar, da ja der Mousemove-Handler des Formulars genötigt wird.

Frage also: Wie komme ich an die aktuelle Mausposition (in Bildschirm-Koordinaten), auch wenn das Anwendungsfenster minimiert ist? Hat jemand da draußen an den Bildschirmen einen Tipp für mich?
Vor vielen Jahren konnte man den Interrupt-Handler abfragen (Interrupt 33, wenn ich mich recht entsinne). Geht das mit modernen Betriebssystemen auch noch? Und ggf. wie?
Boah man, ist das lange her ...

Gruß

ankh
Mitglied: narthan
24.09.2014 um 08:34 Uhr
Moin,

vlt. hilft dir folgendes:
Als ich das vor einiger Zeit brauchte, habe ich das HIER gefunden.
Einfach das Script mit dem Editor von AutoIT speichern und dann mit RunScript von AutoIT ausführen. Koordinaten werden dann in der linken Ecke oben angezeigt und können mit STRG+S zusätzlich in eine txt-Datei gespeichert werden.

01.
 MsgBox(0, "Tastaturkürzel", "Mit STRG+S werden die Koordinaten in der Textdatei gespeichert." & @CRLF & "Mit STRG+D wird der Inhalt der Textdatei gelöscht"&@crlf&"Mit STRG+F werden Koordinaten und Pixelfarbe in HEX gespeichert") 
02.
 
03.
While 1 ;eigentliche schleife die die Koordinaten abliest und anzeigt 
04.
    HotKeySet("{esc}", "ende") 
05.
    HotKeySet("^s", "save") 
06.
    HotKeySet("^f", "savewithcoords") 
07.
    HotKeySet("^d", "delete") 
08.
    $file = FileOpen("coords.txt", 1) 
09.
    $pos = MouseGetPos() 
10.
    $px = PixelGetColor($pos[0] ,$pos[1]) 
11.
    ToolTip($pos[0]&", "&$pos[1]&@CRLF&"Pixelfarbe: "&Hex($px, 6), 0, 0) 
12.
    Sleep(20) 
13.
WEnd 
14.
 
15.
Func save() ;speichert die Koordinaten 
16.
    If $file = -1 Then Exit MsgBox(0, 'Maus-Koordinaten', 'Datei konnte nicht geöffnet werden!') ;überprüft ob die Datei schon vorhanden ist 
17.
    FileWrite($file, $pos[0] & ", " & $pos[1] & @CRLF) 
18.
    FileClose($file) 
19.
EndFunc   ;==>save 
20.
 
21.
Func savewithcoords() ;speichert die Koordinaten 
22.
    $file = FileOpen("coords.txt", 1) 
23.
    If $file = -1 Then Exit MsgBox(0, 'Maus-Koordinaten', 'Datei konnte nicht geöffnet werden!') ;überprüft ob die Datei schon vorhanden ist 
24.
    FileWrite($file, $pos[0] & ", " & $pos[1] &" "& Hex($px, 6) & @CRLF) 
25.
    FileClose($file) 
26.
EndFunc   ;==>save 
27.
 
28.
Func delete() ;löscht den Inhalt der Textdatei 
29.
    $file = FileOpen("coords.txt", 2) 
30.
    FileClose($file) 
31.
EndFunc   ;==>delete 
32.
 
33.
Func ende() ; logischerweise: Ende xD 
34.
    Exit 
35.
EndFunc   ;==>ende
Grüße, narthan
Bitte warten ..
Mitglied: AnkhMorpork
24.09.2014 um 08:48 Uhr
Hallo narthan,

vielen Dank für deinen Beitrag. Aber ich glaube, wir haben uns mißverstanden. Ich benötige eine Pascal-Routine, die das erledigt, da ich es in ein bestehendes Programm integrieren möchte. Und ich möchte keine EXE in einer EXE verwursten.

Gruß

ankh
Bitte warten ..
Mitglied: narthan
24.09.2014 um 09:05 Uhr
Oh alles klar, dann hab ich das tatsächlich falsch verstanden. Pardon
Bitte warten ..
Mitglied: colinardo
24.09.2014 um 12:35 Uhr
Moin Ankh,
kenne Pascal überhaupt nicht, aber laut Doku sollte sich die Mausposition in Screenkoordinaten mit GetMouseX / GetMouseY abfragen lassen.

Grüße Uwe
Bitte warten ..
Mitglied: AnkhMorpork
24.09.2014 um 12:39 Uhr
Zitat von colinardo:

Moin Ankh,
kenne Pascal überhaupt nicht, aber laut Doku sollte sich die Mausposition in Screenkoordinaten mit
GetMouseX / GetMouseY abfragen lassen.

Grüße Uwe

Hallo Uwe,

ja, das funktioniert aber nur in der Konsole. Ich kasper mit eine GUI-Umgebung rum.
Sorry, hatte ich vergessen zu erwähnen.

Trotzdem danke!


Gruß

ankh
Bitte warten ..
Mitglied: colinardo
LÖSUNG 24.09.2014, aktualisiert 25.09.2014
Und was ist wenn du einfach die Windows API Funktion GetCursorPos über die user32.dll einbindest und aufrufst ?
ungefähr so einzubinden:
function GetCursorPos(var lpPoint: TPoint):Boolean;stdcall;external 'user32.dll';
Bitte warten ..
Mitglied: AnkhMorpork
24.09.2014, aktualisiert um 15:42 Uhr
Zitat von colinardo:

Und was ist wenn du einfach die Windows API Funktion
GetCursorPos über die user32.dll
einbindest und aufrufst ?

DAS mus ich mal genauer beschnuppern. Da fehlt zwar noch einiges an Erfahrung, aber dat krije mer schonn.
Ist mir garnicht in den Sinn gekommen - blind ...

Danke für den Tipp!


EDIT:
Tja, das führt leider in dieselbe Sackgasse. Das Mousemove-Ereignis wird nur solange erkannt, wie sich der Zeiger innerhalb des Anwendungsfensters befindet. Das soll aber letztendlich minimiert werden.
Ich werde wohl eine komplett andere Strategie verfolgen müssen ...
Bitte warten ..
Mitglied: colinardo
25.09.2014, aktualisiert um 10:31 Uhr
Zitat von AnkhMorpork:
EDIT:
Tja, das führt leider in dieselbe Sackgasse. Das Mousemove-Ereignis wird nur solange erkannt, wie sich der Zeiger innerhalb
des Anwendungsfensters befindet.
Das ist ja auch klar, da es nur die Anwendung erfasst.
Das soll aber letztendlich minimiert werden.
Mach die Abfrage über das API und einer While Schleife, feddich...
Bitte warten ..
Mitglied: AnkhMorpork
25.09.2014, aktualisiert 26.09.2014
Jepp - so geidas ... war doch ganz einfach.
Jetzt habe ich eine Arbeitsgrundlage, mit der ich weiterbasteln kann.

Wenn du mir mal im realen Leben über den Weg laufen solltest, gebe ich einen aus.

Gruß

ankh


Kleiner Nachtrag:

Die Definition der Funktion in fpc sieht konkret so aus:
function GetCursorPos(var lpPoint: TPoint):Boolean;

Ich habe das in einer kleinen Testumgebung probiert, und es lief optimal. Formular mit TLabel (zur Positionsanzeige), Umschalter und Timer.
Die Timer-Lösung ist zwar nicht optimal, aber zum Testen erträglich.

Hier mal der Quelltext:

01.
unit MousePosScreen_unit1; 
02.
 
03.
{$mode objfpc}{$H+} 
04.
 
05.
interface 
06.
 
07.
uses 
08.
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, 
09.
  Windows, LCLIntf, ExtCtrls; 
10.
 
11.
type 
12.
 
13.
  { TForm1 } 
14.
 
15.
  TForm1 = class(TForm) 
16.
    Button1: TButton; 
17.
    Label1: TLabel; 
18.
    Timer1: TTimer; 
19.
    procedure Button1Click(Sender: TObject); 
20.
    procedure FormCreate(Sender: TObject); 
21.
    PROCEDURE ShowMousePosition; 
22.
    procedure Timer1Timer(Sender: TObject); 
23.
  private 
24.
    { private declarations } 
25.
  public 
26.
    { public declarations } 
27.
  end; 
28.
 
29.
var 
30.
  Form1: TForm1; 
31.
  pos: TPoint; 
32.
  WantShowPos: BOOLEAN; 
33.
 
34.
implementation 
35.
 
36.
{$R *.lfm} 
37.
 
38.
{ TForm1 } 
39.
 
40.
PROCEDURE TForm1.ShowMousePosition; 
41.
BEGIN 
42.
  IF WantShowPos THEN 
43.
  BEGIN 
44.
       GetCursorPos(pos); 
45.
       Label1.Caption := IntToStr(pos.x) + ' | ' + IntToStr(pos.y); 
46.
  END; 
47.
END; 
48.
 
49.
procedure TForm1.Timer1Timer(Sender: TObject); 
50.
begin 
51.
     Application.Processmessages; 
52.
     ShowMousePosition 
53.
end; 
54.
 
55.
procedure TForm1.FormCreate(Sender: TObject); 
56.
begin 
57.
     WantShowPos := FALSE; 
58.
end; 
59.
 
60.
procedure TForm1.Button1Click(Sender: TObject); 
61.
begin 
62.
     WantShowPos := NOT WantShowPos; 
63.
end; 
64.
 
65.
 
66.
 
67.
end.
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

Batch & Shell
gelöst Appx aus Image auslesen und entfernen (9)

Frage von Markus2016 zum Thema Batch & Shell ...

JavaScript
gelöst Dropdownfeld auslesen und mit AJAX und JS an PHP senden (7)

Frage von ITFlori zum Thema JavaScript ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...