Dienstag, 20. Juli 2010

Alle Fenster minimieren / Desktop anzeigen

Um mit einem C# - Programm den gleichen Effekt wie die Taskleistenverknüpfung "Desktop anzeigen" zu erhalten, alle Fenster also zu minimieren, müssen wir ein wenig tiefer in die Systemarchitektur eindringen und ein älteres COM - Objekt benutzen.
Das Component Object Model ist eine Plattformtechnik zur Verwaltung von Objekten. In .Net werden diese Komponenten eigentlich nicht mehr benutzt, doch, wie man sieht, ab und zu braucht man diese trotzdem noch. COM - Objekte können durch ihre GUID (Globally Unique Identifier) - Nummer angesprochen werden, die ein Objekt eindeutig referenziert.
Diese Nummer ist jedoch für uns Menschen nicht verständlich und schwer zu merken, deshalb gibt es weiterhin die ProgID (Programmatic IDentifier), welche leichter verständlich ist (z.B. in der Form Projekt.Klasse).
Die ProgIDs sind in der Registry mit den GUIDs verknüpft.

Um jetzt alle Programme zu minimieren, brauchen wir den COM - Typ Shell.Application. .Net kann einen entsprechenden Typ aus der Registry mit der Funktion Type.GetTypeFromProgID() suchen. Ausgehend von dem gefundenen Typ kann über die Funktion Activator.CreateInstance() ein Objekt des Typs instanziert werden. Mit InvokeMember() kann schließlich eine Funktion des Objekts aufgerufen werden. Genug der Theorie, hier einfach der Code zur Minimierung:

Type typeShell = Type.GetTypeFromProgID("Shell.Application"); // COM - Objekt per ProgID aus Registry referenzieren und laden
object objShell = Activator.CreateInstance(typeShell); // Instanz von Shell.Application anlegen
typeShell.InvokeMember("MinimizeAll", System.Reflection.BindingFlags.InvokeMethod, null, objShell, null); // Funktion MinimizeAll aufrufen

Beim Aufruf von InvokeMember() gibt der erste Parameter an, das die Funktion MinimizeAll benutzt werden soll, der 2. ein Binding Flag (hier besagt es, dass die Funktion aufgerufen werden soll) und der 4., dass dabei das Objekt objShell benutzt werden soll.

Keine Kommentare:

Kommentar veröffentlichen