Ich habe folgendes Problem:
Ich habe 3 Anwendungen programmiert (rein WinAPI mit Ressource), die
über ein weiteres Programm per CreateProcess (oder wie auch immer) zu
einer dynamischen Anzahl von Instanzen gestartet werden sollen. Damit
die einzelnen Fenster nicht übereinander liegen wollte ich die Fenster
schön neben- und untereinander anordnen. Nur leider reagieren die
Fenster da nicht drauf wenn ich es so mache:
1
STARTUPINFOStartupInfo;
2
PROCESS_INFORMATIONProcInfo;
3
HWNDwindow[10];
4
5
memset(&ProcInfo,0,sizeof(ProcInfo));
6
memset(&StartupInfo,0,sizeof(StartupInfo));
7
8
StartupInfo.cb=sizeof(StartupInfo);// Set structure size
Das geht anders. Du musst von den laufenden Anwendungen ein
Fensterhandle bestimmen und an dieses die Nachricht WM_MOVEWINDOW senden
(mit PostMessage), der Du die zu verwendendenden Koordinaten mitgibst.
Mmh, das geht irgendwie nicht. Das Handle bleibt leer:
1
HANDLEprog1;
2
prog1=FindWindow(NULL,"TestProg");
Das zu startende Programm hat aber den Fenstertitel TestProg, von daher
gibt es das. Eine Class kann man beim arbeiten mit Resourcen nicht
festlegen zumindest meckert das Programm dann beim starte wenn ich eine
CLASS eingebe (Error x57f).
Noch eine Idee?
FindWindow funzt nicht, das sucht nur in einer Ebene. Du musst dich
händisch durch den Fenterbaum wühlen.
Zuerst von deinem Fensterchen bis zum Root-Window (oops, kann sein dass
das Desktop-irgendwas heißt). Da findest du dann mindestens 2 Stück,
eines vom aktuellen Desktop und eines vom Anmeldemanager (auf das hast
du normalerweise keine Zugriff). Dann sucht du vom Root-Fenster alle
Child-Fenster durch.
Lass dir auch mal den Baum ausgeben, der ist ist sehr aufschlussreich
:-)
Ich hab' vor Ewigkeiten mal ein passendes Programm geschrieben (als ich
noch Windows hatte), aber ich find' den Code grad' nicht.
Auch sehr aufschlussreich:
Aus dem Developer Studios, das Programm Spy++
Sehr gut um zb Window-Handles zu überprüfen bzw. die komplette
Window-Hierarchie zu durchforsten, bzw. die Handles, die man vom
FindWindow bekommt in einen Kontext zu stellen.
Bringt mir aber nichts, weil die Handles immer anders sind, da sie beim
Aufruf vergeben werden. Aber mir fällt gerade ein, dass ich dem Prozess
ja einfach die Koordinaten bzw. einen Index als Parameter übergeben
kann, dass steuert das jeder Prozess für sich selbst.
Vor ein paar Jahren habe ich das aber schonmal hinbekommen, allerdings
mit Konsolenfestern. Muss ich mal gucken, ob ich da den Quellcode noch
wiederfinde. Ich glaube da konnte ich das direkt über die StartupInfo
übergeben. Vielleicht weil das CMD als CW_USEDEFAULT arbeitet. Aber
eigentlich müsste ich meine Anwendungen dazu ja auch bringen können.
Timmo H. schrieb:
> Bringt mir aber nichts, weil die Handles immer anders sind, da sie beim> Aufruf vergeben werden.
Schon klar.
Aber wenn du dein Programm debuggen willst und wissen willst, welche
Handles du da überhaupt geliefert bekommst, ist so ein Tool äusserst
hilfreich.
Auch ist es hilfreich bei einem Testlauf das Handle des interessierenden
Fensters zu kennen, um dann im Code nachzusehen wo und warum das eben
nicht geliefert wird.