Während ich für den Artikel „Mehrere unabhängige Excel 2013 Instanzen aufrufen“ vom 05.07.2013 die von mir aufgerufenen Excel 2013 Instanzen untersuchte, ob diese tatsächlich unabhängig voneinander waren, fiel mir auf, dass Excel 2013 immer ein verstecktes Anwendungsfenster im Hintergrund mitführt. Dieses versteckte Fenster ist in früheren Excel-Versionen nicht vorhanden.
Dies hatte mich neugierig gemacht und dazu veranlasst, weiter zu recherchieren. Hierbei stellte ich mir folgende Fragen: im welchen Ausmaß hat sich eigentlich der Aufbau der Fensterverwaltung in Excel 2013 im Verhältnis zu früheren Versionen verändert? Sind ähnliche Veränderungen in den anderen Office Anwendungen ebenfalls vorhanden? Wirken sich diese Änderungen bei Excel 2013 auf VBA-Code aus?
Grundlegender Aufbau von Windows-Anwendungen
Bevor ich jedoch mit dem Vergleich zwischen Office 2010 und Office 2013 starte, zunächst einige Basics zum grundlegenden Aufbau von Windows Anwendungen, die eine grafische Oberfläche bieten. In der Regel beinhalten diese mindestens ein am Bildschirm sichtbares Hauptfenster. Und, oftmals setzt sich das Hauptfenster wiederum aus einer ganzen Reihe von weiteren Fenstern zusammen, die sich hierarchisch dem Hauptfenster unterordnen und bestimmte Aufgaben übernehmen, wie beispielsweise Menüleisten, Symbolleisten oder Statusleisten.
Neben dem Hauptfenster beinhalten die meisten Anwendungen auch Dialoge zur Interaktion mit den Anwendern. Dialoge, sowie die darin enthaltenen Steuerelemente, wie Schaltflächen, Eingabefelder oder Auswahlfelder sind in Windows jeweils als eigenständige Fenster zu sehen und ordnen sich in ebenfalls in der Hierarchie ein.
Obere Abbildung zeigt einen solchen Aufbau am Beispiel des Windows Editors. Das Hauptfenster mit der Bezeichnung „Notepad“ – oder korrekterweise Klassenname – ist direkt dem entsprechenden Prozess untergeordnet. Unterhalb dieses Fensters befindet sich das Textfeld, welches in dem Beispiel den Text „Hallo Welt“ enthält.
Der Dialog zum Suchen hat sich neben dem Hauptfenster als eigenständiges Fenster unterhalb des Prozesses eingeordnet. Die einzelnen Steuerelemente sind wiederum dem Dialogfenster untergeordnet.
Jedem Fenster wird zudem zur Laufzeit ein sogenanntes „Handle“ in Form einer hexadezimalen Zahl durch das Betriebssystem zugewiesen, über welches das Fenster eindeutig identifiziert werden kann.
Das Aussehen und die Fähigkeiten einzelner Fenster – z.B. ob diese einen Rahmen oder Schaltflächen zum Maximieren und Minimieren besitzen – erfolgt bei der Windows-Programmierung durch Setzen entsprechender Eigenschaften – in der Regel über die Zuweisung einer Kombination von Konstanten. Diese Eigenschaften lassen sich auch oftmals unter Zuhilfenahme entsprechender Tools, wie z.B. WinSpy++, zur Laufzeit einer Anwendung ändern, so dass beispielsweise ein unsichtbares Fenster wieder sichtbar gemacht werden kann.
Die Fensterverwaltung in Office 2010
Nach dem Start von Excel 2010 ist dessen Hauptfenster unter dem Klassennamen XLMAIN in der Hierarchie wiederzufinden. Auf gleicher und tiefer liegenden Ebenen befinden sich eine ganze Reihe weitere Fenster, wovon einige die in dem Screenshot über die graue Schrift als unsichtbar bzw. inaktiv gekennzeichnet sind.
Unterhalb des Hauptfensters sind beispielsweise auch das Menüband oder die Scroll-Balken eingeordnet. Die Fensterklasse XLDESK repräsentiert den Bereich in Excel 2010, indem Sie einzelne Arbeitsmappen anordnen können. In dem abgebildeten Beispiel wurden zwei neue Arbeitsmappen angelegt, die durch die Einträge EXCEL7 repräsentiert werden.
Die Option „Fenster in Taskleiste“ bestimmt in Excel 2010 bzw. Word 2010, ob einzelne Dokumente in der Anwendung innerhalb desselben Anwendungsfensters geladen und dargestellt werden können oder ob für jedes Dokument ein neues Anwendungsfenster inklusive Menüband geladen wird. Für Excel 2010 macht es hierbei keinen Unterschied in der Fensterhierarchie, ob die Einstellung „Fenster in Taskleiste“ gesetzt ist oder nicht.
Im Gegensatz zu Excel 2010 berücksichtigt jedoch Word 2010 sehr wohl die Option „Fenster in Taskleiste“ und ordnet die Dokumentenfenster unterschiedlich in die Hierarchie ein. Falls die Option nicht gesetzt und somit das Multiple Document Interface aktiv ist, legt Word 2010 die Fensterhandles der Dokumentfenster im Unterpunkt _WwF unterhalb des Hauptfensters mit dem Klassennamen OpusApp ab.
Ist die Option gesetzt und wird somit jedes Dokument in einem eigenem Fenster dargestellt, erstellt Word 2010 ein neues Handle für ein zweites Hauptfenster und sortiert das entsprechende Dokument dort ein.
In PowerPoint 2010 steht die Option „Fenster in Taskleiste“ nicht zur Verfügung, weshalb PowerPoint jedes Hauptfenster wie Word 2010 mit aktiver Option unterhalb des Prozesses „Powerpnt.exe“ unter dem Klassennamen PPTFrameClass ablegt.
Die Fensterverwaltung in Office 2013
In Office 2013 wurde die Option „Fenster in Taskleiste“ entfernt. Die Fensterhandles jedes geöffneten Fensters ordnen sich dann direkt unterhalb des Prozesses ein. Hierbei ist es auch unerheblich, ob Sie ein zweites Dokument anlegen bzw. öffnen oder für dasselbe Dokument eine zweite Ansicht via dem Menübefehl „Ansicht – Neues Fenster“ erzeugen. Dies trifft zu mindestens für die von mir getesteten Anwendungen Excel 2013, Word 2013 und PowerPoint 2013 zu.
Folgender Screenshot zeigt die Fensterhierarchie von Excel 2013 direkt nach dem Anlegen einer neuen Arbeitsmappe.
Schnell fällt die Fensterklasse MSO_BORDEREFFEKT_WINDOW_CLASS auf, die in den vorherigen Versionen nicht vorhanden ist. Diese Fensterklasse repräsentiert eigenständige Fenster an den äußeren Rändern des Excel-Anwendungsfensters und ist übrigens auch in den weiteren Office 2013 Anwendungen zu finden.
Microsoft hat somit meines Erachtens für die Schatteneffekte an den Rändern der Anwendungsfenster, die z.B. unter Windows 7 zu sehen sind, eine von den Windows Vorgaben unabhängige Implementierung durchgeführt. Die Fenster-Handles für die Schatteneffekte erscheinen übrigens auch in weiteren Konstellationen, z.B. wenn ein Hinweisfenster (Tooltip) eingeblendet wird.
Zudem ist in der Fensterhierarchie für Excel 2013 ein weiterer interessanter Effekt zu beobachten: sobald Sie Excel 2013 öffnen, wird neben dem Hauptfenster ein weiteres unsichtbares Hauptfenster mit dem Klassennamen XLMAIN angelegt.
Wird dieses sichtbar gemacht, ist erkennbar, dass es dieselbe Größe und Position annimmt wie das sichtbare Hauptfenster. Und, Größen- und Positionsänderungen am Hauptfenster führen dazu, dass sich das zweite Fenster immer entsprechend anpasst, also dem Hauptfenster folgt.
In oberer Abbildung habe ich dieses Fenster in den Vordergrund geholt. Zu sehen sind einige Steuerelemente, die auch ein normales Anwendungsfenster aufweist, wie der Namensbereich und die Eingabezeile für Formeln. Beide Elemente sind jedoch inaktiv und können nicht verwendet werden. Und, ein Menüband ist nicht vorhanden.
Wenn Sie eine zweite Mappe anlegen, z.B. über Strg+N, koppelt sich das unsichtbare Fenster sofort an das neue Dokumentfenster. Ebenso, wenn Sie ein zweites Fenster für ein bestehendes Dokument über den Menübefehl „Ansicht – Neues Fenster“ aufrufen. Das unsichtbare Fenster folgt somit immer dem aktiven Fenster.
Ich war gespannt, ob Word 2013 ebenfalls ein solches unsichtbares Fenster anlegen würde. Interessanterweise geschieht dies nicht, wenn Sie Word 2013 öffnen und ein leeres Dokument anlegen. Word 2013 verhält sich beim Start wie Word 2010 bei aktivierter Option „Fenster in Taskleiste“.
Wenn Sie ein zweites Dokument in Word 2013 anlegen oder ein neues Fenster für das bestehende Dokument erzeugen, verhält sich Word 2013 ebenfalls wie erwartet und ordnet die Fenster unterhalb des Prozesses ein.
Wenn Sie jedoch das zweite Fenster bzw. Dokument schließen, verschwindet das entsprechende Fenster nicht aus der Fensterhierarchie, sondern wird geleert und unsichtbar geschaltet. Folgender Screenshot zeigt zwei geöffnete Dokumente sowie ein übrig gebliebenes leeres Fenster.
Sobald Sie dann wieder ein neues Dokument anlegen, erzeugt Word nicht ein neues Fenster, sondern lädt das Dokument in das versteckte Fenster und hebt dessen Unsichtbarkeit auf. Legen Sie dann weitere Dokumente an oder erzeugen neue Fenster, werden wieder auch neue Fensterhandles generiert. Schließen Sie wieder ein oder mehrere Fenster, bleibt immer eines übrig, das wiederum im Falle der Erzeugung eines neues Fensters genutzt wird.
Das Verhalten unterscheidet sich somit von Excel 2013, wo immer ein unsichtbares Fenster mitgeführt wird. Bei PowerPoint 2013 konnte ich kein unterschiedliches Verhalten im Verhältnis zu PowerPoint 2010 feststellen.
Auswirkungen auf Code in Excel 2013
Die nächste Frage, die mich beschäftigte war, ob die neue Fensterverwaltung Auswirkungen auf VBA-Code zur Ermittlung der Fenster in Excel 2013 hat. Um es vorweg zu nehmen: nein. Code wie beispielsweise Application.Windows.Count oder die Aufzählung der Fenster per Schleife funktionieren wie gewohnt.
Sollten Sie jedoch allerdings zur Auflistung der Fenster Windows API-Funktionen verwenden, so sollten die unsichtbaren Fenster berücksichtigt bzw. gegebenenfalls herausgefiltert werden. Eine Beispielmappe, die Sie hier nachfolgend herunterladen können, zeigt die Problematik auf.
» Beispielmappe zur Abfrage der Fenster via VBA und API
Der Code mit den Windows API-Funktionen in der Beispielmappe filtert das unsichtbare Fenster nicht heraus. Dieses lässt sich jedoch recht einfach bewerkstelligen, indem Sie Länge des Fenstertitels in der Variable strCaption abfragen. Ist die Länge kleiner 1, handelt es sich um das versteckte Fenster.
Fazit
Die Änderungen an der Fensterverwaltung zeigen, dass die Neuerungen in Office 2013 nicht nur kosmetischer Natur sind, sondern auch tiefer greifende Veränderungen stattgefunden haben. Für VBA ändert sich nicht viel in Bezug zu Code, der Fenster auflistet bzw. auf diese zugreift. Die Windows API wird sicherlich in den seltensten Fällen zum Einsatz kommen, aber hier gilt es, die neuen Gegebenheiten zu berücksichtigen.
Wieso sich die Fensterverwaltung auch innerhalb der von mir drei geprüften Office 2013 Anwendungen Excel, Word und PowerPoint unterscheidet, vermag ich leider nicht zu beantworten. Eine Vermutung ist, dass es möglicherweise durch die Altlasten im Code der Anwendungen technisch gesehen nicht möglich war, alle Anwendungen gleichermaßen umzustellen. Vielleicht ist dies ja einer nächsten Version vorbehalten.
Hallo,
toller Artikel. Wir haben leider das Problem dass bei einer Excel 2013 Installation bei Doppelklick auf eine Datei, immer 2 Fenster geöffnet werden. Einmal das versteckte und einmal die Datei selber. Wie kann ich den Fehler beheben? Danke!