Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fenster einer Fremdapplikation auslesen / positionieren (https://www.delphipraxis.net/122568-fenster-einer-fremdapplikation-auslesen-positionieren.html)

The Riddler 18. Okt 2008 12:46


Fenster einer Fremdapplikation auslesen / positionieren
 
Hallöchen!

Damit sich nicht wieder jemand beschwert versuche ich mich so klar wie möglich auszudrücken. :angel:

Es gibt da eine Fremdapplikation, welche mehrere verschiebbare Fenster hat. Leider haben die Programmierer dieses Programms nicht bedacht, dass es extrem nervig ist wenn man nach jedem Neustart der Software erst die vielen Fenster wieder angenehm positionieren muss bevor man damit arbeiten kann. Sagen wir mal es gehen acht Fenster an ein und derselben Position auf und der Anwender muss diese nun jedes Mal neu positionieren sodass er alle angenehm im Blick hat.

Daher möchte ich ein kleines Programm schreiben, dass die aktuellen Fensterpositionen der Fremdanwendung ausliest (welche vom User angeordnet wurden), diese speichert und bei einem Neustart der Fremdanweisung die Fenster mittels eines Klickes wieder so wie abgespeichert anordnet.

Die Frage ist nur wie. :D Das Auslesen der Fenster-Handles bringt nicht wirklich etwas, da sich die Handles seltsamerweise immer ändern. Alle Fenster haben die gleiche Größe. Hat jemand eine Idee wie man das am besten bewerkstelligen könnte?

Apollonius 18. Okt 2008 13:13

Re: Fenster einer Fremdapplikation auslesen / positionieren
 
Du musst die Fenster irgendwie identifizieren, am besten über den Fensterklassennamen. Mit EnumThreadWindows iterierst beim Beenden der Applikation durch die Fenster und speicherst für jedes Fenster den Klassennamen und die Positionsdaten. Beim Neustart stellst du die Positionen wieder her.

The Riddler 18. Okt 2008 13:38

Re: Fenster einer Fremdapplikation auslesen / positionieren
 
Hast du dafür vlt. ein paar kleine Beispiele oder Referenzen, da ich nicht so bewandert in Delphi bin, jedenfalls nicht was sowas angeht. Danke Dir.

jfheins 18. Okt 2008 13:40

Re: Fenster einer Fremdapplikation auslesen / positionieren
 
Nimm Hier im Forum suchenWinSpy und alss dir den Code genereiren :mrgreen:

Weil ich so nett bin: http://www.delphipraxis.net/internal...ghlight=winspy ;)

The Riddler 18. Okt 2008 14:56

Re: Fenster einer Fremdapplikation auslesen / positionieren
 
Danke jfheins, bist ja wirklich ein Netter. :-)

Also WinSpy hab ich mir geholt. Er zeigt mir auch alle Informationen zu den aktiven Fenster an, also Koordinaten, Klasse und das Handle. Nur wie gesagt, hat jedes Fenster immer ein anderes Handle. Wie kann ich nun alle aktiven Fenster auslesen, die Positionen speichern und beim nächsten Start die Position der Fenster automatisch ausrichten? Beim nächsten Start sind dann andere Fenster und somit andere Handles!? Der Code-Generator geht bei mir gar nicht. Ich rufe ihn in einer VM auf, nach 5min Sanduhr kann ich den Task WinSpy nur noch abschießen. :?

jfheins 18. Okt 2008 16:18

Re: Fenster einer Fremdapplikation auslesen / positionieren
 
Zitat:

Zitat von The Riddler
Danke jfheins, bist ja wirklich ein Netter. :-)

Das wollte ich hören :mrgreen:

Zitat:

Also WinSpy hab ich mir geholt. Er zeigt mir auch alle Informationen zu den aktiven Fenster an, also Koordinaten, Klasse und das Handle. Nur wie gesagt, hat jedes Fenster immer ein anderes Handle. Wie kann ich nun alle aktiven Fenster auslesen, die Positionen speichern und beim nächsten Start die Position der Fenster automatisch ausrichten? Beim nächsten Start sind dann andere Fenster und somit andere Handles!? Der Code-Generator geht bei mir gar nicht. Ich rufe ihn in einer VM auf, nach 5min Sanduhr kann ich den Task WinSpy nur noch abschießen. :?
Komisch :gruebel:

Also du startest WinSpy, klickst auf den Button "Fenster auswählen" hältst die Maustaste gedrückt, und ziehst sie auf das Fenster deiner Wahl. Jetzt sollte in der Treeview was sein, und du müsstest den Code generieren können :gruebel:

Mit WinSpy selber kannst du die Positionen nicht speichern, aber es kann dir helfen, ein derartiges Programm selber zu programmieren ;)

The Riddler 18. Okt 2008 18:19

Re: Fenster einer Fremdapplikation auslesen / positionieren
 
Hallo jfheins,

es tut mir Leid aber ich habe mich wohl vertan. Jetzt geht es. Nur leider, bringt mich das nicht weiter. WinSpy spuckt jetzt so etwas aus:
Delphi-Quellcode:
var
  wndMain: HWND;
begin
  wndMain := FindWindow('XXXXDEVICE','User: XXXXX');
  if wndMain <> 0 then
  begin
     ShowMessage('Window Handle: ' + IntToStr(wndMain));
     FlashControl(wndMain); // internal function
  end;
end.
Wie du siehst, steht ein Name in der Caption der fremden Fenster. Das heißt, jedes Fenster bei jedem User bei jedem Mal hat einen anderen Namen. Somit würde FindWindow() wie ich mir das denke fehlschlagen. Ich müsste also irgendwie alle Fenster von XXXXDEVICE auslesen, dann deren Position bekommen und das irgendwie speichern. Dann ist angedacht, dass der User bei dem fremden Programm sagen wir 5 Fenster öffnet und mein Programm dann diese 5 Fenster so positioniert wie die Position beim ersten Mal (wo mein Programm die Positionen gespeichert hat). Nur irgendwie, komme ich nicht weiter. :-(

Zitat:

Das wollte ich hören :mrgreen:
Für weitere Hilfe schmeiß ich dir gerne noch mehr Schmeicheleien zu. :P

jfheins 18. Okt 2008 19:23

Re: Fenster einer Fremdapplikation auslesen / positionieren
 
Wenn die Captiuon veränderlich ist hast du 2 Möglichkeiteen:

1. Sie ist dir egal, dann ändere den Parameter in nil
also z.B.
Delphi-Quellcode:
FindWindow('XXXXDEVICE',nil);
Dann kann es aber sein, dass das nicht genau das gesuchte Fenster ist, in diesem Fall ==> 2.

2. Sie ist wichtig zur Unterscheidung. In diesem Fall kannst du mit enumwindows alle Fenster durchgehen, um dein Fenster zu finden. Im Callback kannst du dann genau überprüfen, ob das Fenster das gesuchte ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 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