Fensterposition und docking

Thomasio

Erfahrenes Mitglied
Ich habe eine Anwendung, die sich genau 2 mal gleichzeitig öffnen lässt
Das habe ich mit 2 mutex geregelt,
Die Anwendung fragt beim öffnen die beiden mutex ab, wenn einer von beiden nicht existiert, dann setzt die Anwendung diesen mutex und läuft als erste oder zweite Instanz, wenn beide bereits existieren wird abgebrochen, so weit kein Problem

Jetzt habe ich eine zweite Anwendung, die ich aus der ersten Anwendung per ShellExecute aufrufe, und zwar jeweils einmal, sprich jede der beiden ersten Anwendungen bekommt einen Partner, was aber effektiv auch wieder 2 mal die gleiche (Unter-)Anwendung ist

Was ich jetzt machen möchte ist die beiden paarweise aneinander zu docken, sprich wenn irgendeins der 4 Fenster verschoben wird, soll automatisch das Partner-Fenster mitkommen
Mein Problem dabei ist, dass die beiden Paare identisch sind, immer die gleichen 2 Anwendungen, einziger Unterschied ist erste oder zweite Instanz
Wie kann ich beim verschieben oder verkleinern/vergrössern eines Fensters
1) herausfinden welches das zugehörige Partnerfenster ist
2) dieses so verschieben, dass es rechts oder unten am Partner "angedockt" bleibt

Das Ganze in einfachem C++ via WINAPI
 
Im Grunde benötigst du ja nur die Kommunikation zwischen den Fenstern.

Du könntest über FindWindow die anderen Fenster finden und dann mit einer eigenen Message-Typ Informationen austauschen. WM_COPYDATA empfiehlt sich, wenn du etwas längere Nachrichten hast.

Ich frage mich allerdings, wenn du da so eine Partneranwendung hast, von der offensichtlich auch der Sourcecode vorliegt, wieso packst du die beiden nicht einfach in ein Programm? Dann ersparst du dir einiges an Rumgemurkse.
 
Bis auf die Position der Fenster und dass die Eine die Andere startet sind die beiden völlig unabhängig, haben völlig getrennte Aufgaben und sind beide relativ gross, darum hätte ich sie gerne getrennt, schon wegen der Übersicht

Das Problem was ich mit FindWindow und Messages habe ist, dass die beiden Paare bis auf ihre mutex jeweils identisch sind, sprich ich kann sie nicht auseinander halten
Grosse Daten muss ich gar nicht verschieben, ich brauche nur eine MoveWindow Message ich weiss nur nicht, wie ich diese an das richtige Fenster schicke, bis jetzt verschiebt er mir immer beide
Und dann habe ich auch noch eine Rückkopplung drin, die effektiv die Sache aufhängt
Wenn jedes Fenster bei Änderung seiner Grösse oder Position eine MoveWindow Message bei seinem Partner auslöst, dann spielen die mit der ersten Message PingPong und nichts geht mehr
 
Dann mach doch was Simples: Da du ja selbst dein Partner-Programm aufrufst, dann gib ihm doch das HWND als Hex-String als Parameter mit. Damit weiss dein Partner-Programm, wer sein Kumpel ist und hat das passende HWND von ihm.

Dann sendest du deine selbst-definierte Nachricht (am besten sowas wie RegisterMessage benutzen), und damit weiss dein Hauptprogramm, welches das zugehörige Partner-Programm ist (HWND als Parameter in die Nachricht packen).
 
Das ginge, wenns nur ein Paar Fenster wäre, in dem Fall hätte ich eh kein Problem, dann geht FindWindow und alles andere sowieso
Es sind aber 2 Paare, mit jeweils identischer HWND die sich nur über den mutex voneinander unterscheiden

Das erste Problem ist also die beiden Paare auseinander zu halten
Das zweite Problem ist dann der PingPong Effekt
Wenn ein Fenster verschoben wird, schickt es an seinen Partner die Message zum mit-verschieben, aber dann muss ich verhindern, dass der Empfänger, der ja nun auch verschoben wird die Message wieder zurück schickt, sonst ended das Ganze in einer stabilen endlos Schleife
 
Deswegen ja der HWND-Parameter, dann weiss dein Zweitprogramm genau, welches sein Parent-Programm ist. Das Zweitprogramm schickt eine selbstdefinierte Nachricht an das Parent-Programm und dieses erhält dadurch das HWND vom Zweitprogramm. Erstes Problem gelöst.

Das mit dem nicht-endlos-hin-und-her schicken sollte sich doch über eine eigene Nachricht und ein boolean Flag machen lassen:

Du benutzt nicht direkt MoveWindow, sondern ebenfalls eine eigene Nachricht. Wird diese empfangen, setzt zu ein boolean Flag und positionierst dann dein eigenes Fenster neu. Wenn jetzt der WM_SIZE-Handler zuschlägt, prüfst du das Flag. Ist es gesetzt, lösche es und tue nichts. Ist es nicht gesetzt, sende deine eigene Nachricht an das andere Programm.
 
Zurück