AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Windows Cursor Veränderung abfragen

Ein Thema von Ajin · begonnen am 27. Feb 2008 · letzter Beitrag vom 27. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#1

Windows Cursor Veränderung abfragen

  Alt 27. Feb 2008, 10:19
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?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Windows Cursor Veränderung abfragen

  Alt 27. Feb 2008, 10:29
Den Cursor kannst Du systemweit mittels TCursorInfo.hCursor abfragen (die Struktur übergibst Du an MSDN-Library durchsuchenGetCursorInfo). Wenn sich dieses Handle geändert hat, dann auch der Cursor. Die Abfrage sollte permanent in einem Thread laufen und bei Änderungen kannst Du dann mittels Synchronize darauf reagieren.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Windows Cursor Veränderung abfragen

  Alt 27. Feb 2008, 11:15
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?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Windows Cursor Veränderung abfragen

  Alt 27. Feb 2008, 11:20
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Windows Cursor Veränderung abfragen

  Alt 27. Feb 2008, 11:31
Zitat von Union:
aber besser wäre ein Thread dafür.
*hust*

Steinigt mich, aber sowas hab ichauch nich nicht gemacht bzw unbewusst
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Windows Cursor Veränderung abfragen

  Alt 27. Feb 2008, 11:46
Dann schau mal in der Hilfe Delphi-Referenz durchsuchenMultithread-Anwendungen entwickeln. Wenn man es nach ein paar Jahren dann verstanden hat, ist es sehr einfach und extrem nützlich

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;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Windows Cursor Veränderung abfragen

  Alt 27. Feb 2008, 12:24
Hast du das "mal eben" geschrieben? 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. Synchronize(Form1.UpdateLabel); wird angemeckert da man Synchronize nicht mit dieser Überladenen Version aufrufen kann
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Windows Cursor Veränderung abfragen

  Alt 27. Feb 2008, 12:32
UpdateLabel muss eine Public procedure von TForm1 sein (Ausschnitt):
Delphi-Quellcode:
 TForm1 = class(TForm)
  public
    { Public declarations }
    procedure UpdateLabel;
  end;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Windows Cursor Veränderung abfragen

  Alt 27. Feb 2008, 12:55
Also hier gibts einiges zum thema threads, aber das ist ja gewaltig... es gibt eine Menge Forenbeiträge zu (Multi)Threading..

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?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Windows Cursor Veränderung abfragen

  Alt 27. Feb 2008, 13:07
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz