Frage

Von einigen Vorversuchen scheint es, dass EnumWindows immer zurückkehrt Fenster in umgekehrter Instanziierung Reihenfolge, dh zuletzt Fenster zuerst instanziiert. Ist das eine gültige Beobachtung? Wenn ja, ist es gilt für alle Versionen von Windows? Und das ist eine zuverlässige Annahme, das heißt, dass das Verhalten irgendwo dokumentiert ist?


Kontext: Ich bin mit einer Situation zu tun, wo ich eine Drittanbieter-Anwendung mehr nicht-modale Fenster zu öffnen bin Auslösung und ich brauche ein paar Fenster Nachrichten an diese Fenster zu senden, wenn sie offen sind, aber mich haben keinen todsicheren Weg, um sie als weder ihre Fensterklassen noch ihre Titel zu identifizieren, unterscheiden und ich ihre erwarteten Koordinaten nicht wissen, auch. Allerdings, wenn ich auf das oben beschriebene Verhalten von EnumWindows verlassen konnte konnte ich einfach den ersten Griff durch EnumWindows deren Klasse und Beschriftung entspricht meine Erwartungen zurück verwenden. Das lässt noch einige hypothetische Schießscharten, aber ich denke, es wird gut genug. Alternative Vorschläge willkommen trotzdem.

War es hilfreich?

Lösung

Es gibt sie in Z-Reihenfolge. Zuerst wird das oberste Fenster mit WS_EX_TOPMOST Satz, bis der am weitesten unten liegenden Fenstern mit WS_EX_TOPMOST set, dann dem obersten Fenster ohne WS_EX_TOPMOST, wenn auch in die am weitesten unten liegenden Fenstern ohne WS_EX_TOPMOST. Beachten Sie, dass die Sichtbarkeit kein ausschlaggebender Faktor ist, so ein unsichtbares Fenster, das als ein sichtbares Fenster in der Z-Ordnung höher ist noch, bevor sie angezeigt werden.

Bearbeiten :

Es ist höchst unwahrscheinlich, dass Sie diese nutzen könnten, wie Sie wollen, nur die erste Rückkehr von EnumWindows nehmen. Nicht nur, dass Ihr neues Fenster unwahrscheinlich, dass die erste Rückkehr sein, aber Sie würden eine Race-Bedingung, wo andere Fenster in der Zwischenzeit geöffnet werden können. Sie könnten, halten jedoch eine Liste aller bekannten Fenster für die Anwendung, und wenn Sie ein neu geöffnetes Fenster finden benötigen, rufen EnumWindows und vergleichen Sie das Fenster mit den in der Liste verarbeitet. Wenn Sie einen finden, die richtige Klasse und Beschriftung hat (man könnte auch prüfen, ob es mit GetWindowThreadProcessID nach rechts Prozess gehört), das ist nicht in Ihrer Liste, dann haben Sie das neue Fenster gefunden.

Für Ihre Zwecke, obwohl, können Sie besser bedient werden, auch durch einen CBT Haken Installation und gerade für die HCBT_CREATEWND Benachrichtigung. Siehe MSDN-Hilfe auf SetWindowsHookEx() und der CBTProc Rückruf für weitere Informationen.

Höhe der Gewissheit über Aufzählung Ordnung :

Eine Reihe von Kommentaren und anderen Antworten auf diese Frage hat einen Mangel an genauer Dokumentation in MSDN über die Reihenfolge, in der erwähnten EnumWindows kehren Fenstergriffe. Und in der Tat, die Seiten auf EnumWindows und die EnumWindowsProc Rückruf sind beide ganz in der Frage schweigt. Ich biete als Beweis die folgenden:

  1. C ++ Q & A Artikel in MSDN Magazin tut Zustand im Einzelnen:

      

    EnumWindows aufzählt, die Fenster in Top-down-Z Ordnung

  2. Die Seite auf EnumChildWindows spielt auf die Reihenfolge in den Erläuterungen Abschnitt:

      

    Ein Kind Fenster, das bewegt wird, oder in der Z-Reihenfolge während der Enumeration wird richtig aufgezählt neu positioniert.

    Dies bedeutet, dass die Reihenfolge Z Ordnung abhängig ist. Und da in der Beschreibung des hWndParent Parameter, heißt es folgendermaßen aus:

      

    Wenn diese Parameter NULL sind, diese Funktion äquivalent zu EnumWindows.

    Man kann davon ausgehen, dass die gleiche Logik und Ordnung zu EnumWindows gilt.

  3. Dies ist das beobachtbare Verhalten dieser Funktion, die es zu einem Bruch Änderung es zu verändern macht. Im allgemeinen hat Microsoft sehr gut über nicht brechen Änderungen beobachtbares Verhalten zu machen. Das ist keine Garantie, aber es ist eine ziemlich sichere Wette. Du bist eher die Funktion, dass in der nächsten Version finden Sie verwenden veraltet-und wurde ersetzt durch noch eine weitere „Ex“ versions als zu finden, dass seine beobachtbaren Verhalten geändert hat.

Natürlich ist das alles sehr akademisch an dieser Stelle, da EnumWindows ist wahrscheinlich nicht die beste Lösung für die der OP Problemzumindest EnumThreadWindows wäre wahrscheinlich eine bessere Passform, aber sein Ich dachte, es wert war, für andere Leute zu erwähnen, die über dieses Thema kommen könnte.

Andere Tipps

Vorherige Antworten müssen erhebliche Verfeinerung. ENUM-order = Z Ordnung nur dann, wenn GetSystemMetrics (SM_IMMENABLED) = 0, das heißt Input Method Manager / Input Method Editor-Funktionen deaktiviert sind. Da alle Fenster Klasse "IME" (der Titel "Default IME") und "MSCTFIME UI" wird aufgezählt, nachdem das Fenster "Progman" ( "Program Manager"), - d. H nicht in Z-Reihenfolge

Die Reihenfolge, in der API nicht angegeben wird ( MSDN Link ), so ist es nicht besonders sein, etwas garantiert - wenn es eine Garantie war, es würde in der API explizit angegeben werden. Was passiert zum Beispiel, wenn ein Fenster auf halben Weg durch die Aufzählung erstellt wird - ist es in der Aufzählung enthalten werden? Dies ermöglicht den Window-Manager die Freiheit, seine Umsetzung zu ändern, wenn sie effizienter werden, dies zu tun.

Es gibt jedoch einen eindeutigen Wert, der verwendet werden kann, um zwischen den Fenstern zu unterscheiden - das Fenster selbst behandeln. In Ihrem EnumWindowProc Methode, speichern Sie das Fenster-Handle für jedes passende Fenster - Sie müssen es trotzdem Nachrichten an das Fenster senden

.

Wenn Sie beiden Prozesse steuern, können Sie von dem ersten ein Sendmessage mit „HWND_BROADCAST“ als ersten Parameter senden.

Dann das andere Programm, wenn die msg erhalten, kann eine Sendmessage zu seinem Kind Fenster tun.

Wenn die Dokumentation sagt nichts über die Reihenfolge der Aufzählung, würde ich dringend empfehlen Sie bleiben von irgendwelchen Annahmen entfernt. Ein paar Beiträge über Raymond Chen Blog (blogs.msdn.com/oldnewthing) würden Sie zeigen, wie viele Anwendungen gibt, die auf all diese undokumentierten Sachen / Beobachtung verlassen und geht etwas schrecklich falsch, wenn eine neue Version von Windows kommt (es sei denn, MS Entwickler einführen noch eine weitere Shim für noch eine andere Anwendung, die sich schlecht benimmt).

Wie für Ihren Zweck gibt es mehrere Funktionen, wie GetWindowThreadProcessID, GetParent, EnumThreadWindows und EnumWindows, dass Sie die Aufgabe erreichen könnte helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top