Alles geordnet
Alles geordnet Für die nun anstehende parallele Anordnung der beiden Explorer-Fenster muss die Main-Prozedur zunächst die effektiv nutzbare Höhe des Bildschirms kennen. Diese ergibt sich aus der vertikalen Bildschirmauflösung, die in Screen.PrimaryScreen.Bounds.Height direkt abrufbar ist, minu...
Alles geordnet
Für die nun anstehende parallele Anordnung der beiden Explorer-Fenster muss die Main-Prozedur zunächst die effektiv nutzbare Höhe des Bildschirms kennen. Diese ergibt sich aus der vertikalen Bildschirmauflösung, die in Screen.PrimaryScreen.Bounds.Height direkt abrufbar ist, minus der Höhe der Windows-Taskleiste, die man mit API-Unterstützung berechnen kann. Dazu finden Sie das Taskleisten-Fensters per FindWindow und ermitteln seine Abmessungen mit HolFensterRechteck.
Bei der nutzbaren Breite des Bildschirms sind üblicherweise keine Abzüge von der horizontalen Auflösung (Screen.PrimaryScreen.Bounds.Width) erforderlich. Die Skalierung der Explorer-Fenster auf die passende Größe und das Verschieben an die richtige Position erledigt die Prozedur jeweils mit einem einzigen Aufruf der API-Funktion MoveWindow.
Der übergibt sie das Handle des betreffenden Fensters und vier Pixelwerte, die die horizontale und vertikale Position der linken oberen Fensterecke (gemessen von der linken oberen Bildschirmecke) sowie die Breite und Höhe des Fensters beziffern. Sollen die Fenster nebeneinander angeordnet werden, errechnet sich ihre Breite ganz einfach, indem man die nutzbare Bildschirmbreite durch zwei teilt.
Die horizontale Position des ersten Fensters liegt dann bei 0, die des zweiten Fensters bei der halben Bildschirmbreite plus einem Pixel.
Mit der Skalierung und parallelen Anordnung beider Explorer-Fenster ist die Hauptarbeit des Programms beendet. Es wartet im Hintergrund, bis der Anwender die Dateiaktionen erledigt hat und das zweite Explorer-Fenster schließt. Dazu prüft eine Do-Loop-Schleife ständig mit der API-Funktion IsWindow, ob das Fenster des zweiten Explorers noch vorhanden ist.
Hier wäre es eleganter, die Programmpause mit der WaitForExit-Methode des gestarteten Explorer-Prozesses zu realisieren - sofern sie denn funktionieren würde, was nicht der Fall ist. Für den Windows-Explorer gelten wohl etwas andere Programmregeln als üblich.
Nachdem jetzt nur noch das ursprüngliche Explorer-Fenster offen ist, muss die Main-Prozedur abschließend noch dessen frühere Größe und Position rekonstruieren. Sie verwendet dazu abermals die API-Funktion MoveWindow und übergibt ihr das passende Fenster-Handle sowie die Werte, die sie eingangs in der RECT-Struktur Explorer1Rechteck gesichert hat.
Die horizontalen und vertikalen Fensterkoordinaten stehen direkt in Explorer1Rechteck.Left und Explorer1Rechteck.Top zur Verfügung. Die Breite ergibt sich aus Explorer1Rechteck.Right minus Explorer1Rechteck.Left, die Höhe aus Explorer1Rechteck.Bottom minus Explorer1Rechteck.Top.
Ende mit Variationen
Wie erwähnt, ist das Setup-Programm von ExplorerDuo für das Anlegen des neuen Kontextmenübefehls In zweitem Explorer öffnen verantwortlich. Konkret fügt es den beiden Registry-Schlüsseln HKEY_CLASSES_ROOT\Drive und HKEY_CLASSES_ROOT\Directory je ein neues Kommando für den Aufruf von ExplorerDuo hinzu.
Das Kommando enthält den vollständigen Pfadnamen des Programms, den Platzhalter %1, den Windows beim Aufruf durch den Pfad des zutreffenden Laufwerks oder Ordners ersetzt, sowie den Befehlsschalter /n, der die Explorer-Fenster nebeneinander positioniert.
Das ist insbesondere auf Bildschirmen im Breitformat sinnvoll. Wer einen Monitor im 4:3-Format verwendet oder die Standardanordnung aus anderen Gründen nicht mag, sollte den Schalter mit Hilfe des Registrierungs-Editors (regedit im Suche-starten-Feld des Windows-Startmenüs eingeben) aus beiden Kommandos entfernen. ExplorerDuo ordnet die beiden Fenster dann stets wohlgefällig untereinander an.