Wie bekommt man die z-Reihenfolge in windows?
Mache ich eine Anwendung, wo ich interagieren mit jeder Laufenden Anwendung. Jetzt brauche ich einen Weg, um das Fenster z-Reihenfolge. Zum Beispiel, wenn Firefox und notepad ausführen, ich brauche zu wissen, was man in front.
Irgendwelche Ideen? Außerdem tun Sie dies für jede Anwendung das Hauptfenster habe ich auch tun müssen, um es für sein Kind und die Schwester windows (Fenster gehören zum gleichen Prozess).
InformationsquelleAutor user361526 | 2009-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die GetTopWindow Funktion durchsucht alle untergeordneten Fenster einem übergeordneten Fenster und kehren Sie ein handle für das untergeordnete Fenster, das höchste in der z-Reihenfolge. Die GetNextWindow-Funktion ruft einen handle für das nächste oder das Vorherige Fenster in der z-Reihenfolge.
GetTopWindow: http://msdn.microsoft.com/en-us/library/ms633514(VS.85).aspx
GetNextWindow: http://msdn.microsoft.com/en-us/library/ms633509(VS.85).aspx
Dies ist nicht zuverlässig.
GetNextWindow
nur AnrufeGetWindow
. Aus derGetWindow
Verweis: "Eine Anwendung, die Anrufe GetWindow zum ausführen dieser Aufgabe Risiken in einer Endlosschleife gefangen oder verweisen auf ein handle für ein Fenster, das zerstört wurde."InformationsquelleAutor NineBerry
Schön und lapidar:
Wenn Sie mehr Zuverlässigkeit:
(Entsprechend dem Abschnitt "Bemerkungen" auf
GetWindow
,EnumChildWindows
ist sicherer als der AufrufGetWindow
in eine Schleife, weil IhreGetWindow
Schleife nicht atomar zu den äußeren änderungen. Nach dem Abschnitt Parameter fürEnumChildWindows
, Aufruf mit einem null-Elternteil entsprichtEnumWindows
.)Dann anstelle von einem separaten Aufruf
EnumWindows
für jedes Fenster, das wäre auch nicht atomic und sicher von der gleichzeitigen änderungen, die Sie senden, jedes Fenster, das Sie vergleichen möchten, in einer params-array, so dass Ihre z-Bestellungen sind alle zur gleichen Zeit abgerufen werden.Eigentlich habe ich meine Meinung geändert. @Erwinus, laut Microsoft top-level-Fenster angezeigt werden, in der z-Reihenfolge bevor "weitere Fenster", was bedeutet, dass eine kleinere z-order-Zahl bedeutet, das Fenster ist tatsächlich höher. Der Weg
EnumWindows
undGW_HWNDPREV
undGW_HWNDNEXT
Arbeit bestätigt dies. Die anderen Antworten hier Zustimmen. Ich bin verabscheuen, um diese gegen die Windows-API.Ich würde Ihre Meinung respektieren. Gibt es noch andere Fallstricke?
Ja, haben einige Zweifel an dieser Methode. Verwenden Sie Ihre ersten code (mit der Benutzung von getWindow(h, GW_HWNDPREV )) aber trotzdem ist etwas anders. Wenn ein Fenster auf ein anderes Fenster können Sie testen, ob Sie das untere Fenster ist in der 'Liste'. Wenn das stimmt, Sie haben zu prüfen, die Grenzen des Fensters zu überprüfen, ob es wirklich überschneidungen.
InformationsquelleAutor jnm2
InformationsquelleAutor MightyZot
Hier ist mein C# - Lösung:
Die Funktion liefert den zIndex unter den Geschwistern von den gegebenen HWND, beginnend bei 0 für die niedrigsten zOrder.
InformationsquelleAutor Kino101