![]() |
Windows Cursor Veränderung abfragen
Hallo DP!
Eine bescheidene Frage: ist es möglich herauszufinden ob und wie sich der Mauscursor verändert wenn es in einem anderen Fenster agiert? Problem: ich operiere auf einer Anwendung auf der sich einige Symbole befinden. Ist der Cursor neben dem Symbol hab ich eine Hand als Maussymbol. Liegt die Maus direkt über dem Symbol erhalte ich ein Kreuz zum Verschieben des Symbols. Meine Anwendung soll nun wissen wann sich der Mauscursor wie ändert und mir das mitteilen. Ich kann den Mauscursor zwar setzen mit delphi, aber abfragen? Wisst ihr da irgendwas? |
Re: Windows Cursor Veränderung abfragen
Den Cursor kannst Du systemweit mittels TCursorInfo.hCursor abfragen (die Struktur übergibst Du an
![]() |
Re: Windows Cursor Veränderung abfragen
Ich bekomme ja eine TCursorInfo zurück welche folgende Struktur hat:
cbSize Specifies the size, in bytes, of the structure. The caller must set this to sizeof(CURSORINFO). flags Specifies the cursor state. This parameter can be one of the following values. 0 The cursor is hidden. CURSOR_SHOWING The cursor is showing. hCursor Handle to the cursor. ptScreenPos Wie kann ich da abfragen wann sich der Cursor geändert hat? In einem Timer der jede Sekunde die Cursorinfo holt? |
Re: Windows Cursor Veränderung abfragen
Ja, Du musst Dir den alten hCursor Wert merken und dann mit dem aktuellen vergleichen. Das kannst Du in einem Timer machen, aber besser wäre ein Thread dafür.
|
Re: Windows Cursor Veränderung abfragen
Zitat:
Steinigt mich, aber sowas hab ichauch nich nicht gemacht bzw unbewusst :dancer2: |
Re: Windows Cursor Veränderung abfragen
Dann schau mal in der Hilfe
![]() In deinem Beispiel als Ansatz (zeigt Mausposition und Cursorhandle in einem Label):
Delphi-Quellcode:
interface ...
type ... TMausInfo = record CursorPos : TPoint; Cursor : HCURSOR; end; TMausThread = class(TThread) private protected procedure Execute; override; public constructor Create(CreateSuspended: Boolean); destructor Destroy; override; end; ... var MausInfo : TMausInfo; implementation ... { TForm1 } procedure TForm1.bnnMausThreadClick(Sender : TObject); begin TMausThread.Create(False); end; procedure TForm1.UpdateLabel; begin // Hier dann auf evtl. Änderungen reagieren LabelMausInfo.Caption := Format('%d/%d x%8.8x', [MausInfo.CursorPos.X,MausInfo.CursorPos.Y, MausInfo.Cursor]); end; { TMausThread } constructor TMausThread.Create(CreateSuspended: Boolean); begin inherited Create(True); FreeOnTerminate := True; if not CreateSuspended then Resume; end; destructor TMausThread.Destroy; begin inherited; end; procedure TMausThread.Execute; var CI : TCursorInfo; begin while not Terminated do begin CI.cbSize := SizeOf(CI); if GetCursorInfo(CI) then begin MausInfo.CursorPos := ci.ptScreenPos; MausInfo.Cursor := ci.hCursor; Synchronize(Form1.UpdateLabel); end; // Wartezeit 1/10 Sekunde (NICHT EXAKT!!!) Sleep(100); end; end; |
Re: Windows Cursor Veränderung abfragen
Hast du das "mal eben" geschrieben? :gruebel: Das Multithreading ist völlig neuland für mich und ich muss mir mal klarmachen, wozu ich das in meinen Projekten nutzen kann.
P.S.
Delphi-Quellcode:
wird angemeckert da man Synchronize nicht mit dieser Überladenen Version aufrufen kann
Synchronize(Form1.UpdateLabel);
|
Re: Windows Cursor Veränderung abfragen
UpdateLabel muss eine Public procedure von TForm1 sein (Ausschnitt):
Delphi-Quellcode:
TForm1 = class(TForm)
public { Public declarations } procedure UpdateLabel; end; |
Re: Windows Cursor Veränderung abfragen
Also
![]() Aber ich weiss nicht genau a) wie ruft man einen Thread auf? b) ist meine Anwendung der Hauptthread und der oben stehende der "nebenthread" der gleichzeitig ausgeführt werden kann seit den 32Bit Betriebssystemen? |
Re: Windows Cursor Veränderung abfragen
Ein Thread wird in der VCL durch den Constructor der Threadklasse erzeugt und gestartet wenn Du Create(False) verwendest. Wird Create(True) verwendet, so wird der Thread erzeugt und ist dann aber angehalten (Suspended), er kann mit Resume fortgesetzt bzw. gestartet werden.
Deine Vermutung b) ist richtig. Ruf doch einfach mal den Taskmanager auf und schau Dir die Spalte "Threads" an, fast jedes Programm arbeitet mit mehr als 1. Aber für diese Threadfragen wäre vielleicht ein eigener Thread ;) angebracht, oder such Dir ein passendes Tutorial. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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