Fenster aktivieren

  • Eine scheinbar simple Aufgabe: Ein Fenster nach vorn bringen (SW_SHOW, SW_SHOWNORMAL, BringWindowToTop). Alle 3 Versuche führen angeblich zum Erfolg: das aktive Fenster ist hinterher dasjenige, welches ich nach vorn bringen wollte. Aber sichtbar ist weiterhin das alte Fenster. Erst dachte ich, dass es aus dem Editor heraus fehlschlägt. Aber der Aufruf der exe aus einer Shell heraus bringt dasselbe Ergebnis. Das verwirrt mich. ?(



    EDIT:

    FindWindow ist nicht geeignet das aktive Fenster zu identifizieren. GetForeGroundWindow() ist die richtige Funktion dafür. Dann zeigt sich auch, dass das aktive Fenster sich nicht ändert, obwohl alle Funktionen Erfolg vermelden.

  • let
    class = "MozillaWindowClass"
    h = FindWindowW(cast[LPWSTR](newWideCString(class, class.len)), nil)

    So findest du alle Windows mit ClassName MozillaWindowClass... bei mir ist das dann aber immer eines der nicht sichbaren, und einige davon haben die Größe 0,0,0,0. Deshalb kann zumindest BringWindowToTop(h) nicht funktionieren und bei ShowWindow(h, SW_SHOW|SW_SHOWNORMAL) siehst du dann natürlich auch nichts, wenn die Größe 0,0,0,0 ist! Die nicht sichbaren, die nicht Größe 0,0,0,0 haben, kann ich aber auch nicht sichtbar machen... liegt evtl. am Style und dass es keinen Inhalt hat, oder das es zu 100% transparent gemacht wurde.


  • OK, "MozillaWindowClass" war nur ein allgemeines Bsp. - wohl schlecht gewählt.

    Ich habe jetzt alle Varianten durchgespielt, einzig mit SetForegroundWindow(hwnd) kann man ein existierendes Fenster anzeigen.


    Was aber ein Problem ist: Ich finde gerade keine sichere Methode das aktive/Vordergrund Fenster zu ermitteln. Die Funktion GetActiveWindow() ist nur für Fenster im eigenen Thread zuständig - also unbrauchbar. GetForegroundWindow() liefert nicht immer das korrekte Handle. Wenn (was leider in Windows häufig passiert) das System für irgendeine vom User nicht veranlasste Aktion den Fokus vom aktiven Fenster nimmt, ist dieses nicht mehr aktiv und die Funktion liefert als Handle "0".

    Ich werde mal testen, ob durch Kombination der Funktionen oder zusätzlicher Abfrage der Z-Order ein eindeutiges Ergebnis möglich ist.

  • Die Z-Order ist ja ein eher fiktiver Wert. Bei meiner Suche bin ich auf 99 Lösungswege gestoßen, die zu 150 Ergebnissen führen. :D

    Aber ernsthaft: Es scheint wohl kein gesichertes Verfahren zu geben, die Z-Order zu bestimmen. GetNextWindow wird nicht empfohlen, da zu unsafe. EnumChildWindows(hDesktop) liefert völlig andere Ergebnisse als EnumDesktopWindows().

    Hier mal meine Variante mit EnumDesktopWindows() - aber ich vertraue den Werten nicht.

  • Es scheint wohl kein gesichertes Verfahren zu geben, die Z-Order zu bestimmen.

    Wir hatten vor einigen Wochen einen User, der das zuletzt aktive Window ermitteln wollte, weil sein Send() oder so sonst nicht da ankommt, wo er es will... dann habe ich gebastelt und es war irgendwas mit Hook oder Register, um die Nachrichten abzufangen, wenn sich im System etwas an einem Window ändert... neu erstellt, vernichtet, Z-Order geändert... aber ich finde es einfach nicht mehr. Grrr...

  • Alle 3 Versuche führen angeblich zum Erfolg: das aktive Fenster ist hinterher dasjenige, welches ich nach vorn bringen wollte.

    Also, wenn ich Dein ursprüngliches Programm (aus Post#1) nehme und statt "Mozilla" "SciTE" benutze, dann funktioniert es genau so, wie es soll:


    Zitat

    Foreground Wnd: 0x0000000000030AF8
    SciTE: 0x0000000000120718
    true
    active Wnd: 0x0000000000120718

  • Hier mal meine Variante mit EnumDesktopWindows() - aber ich vertraue den Werten nicht.

    So bekommst du nur die Windows vom primären Desktop/Monitor. Veschiebe ich Notepad++ auf einen anderen Monitor, taucht es nicht mehr in der Liste auf.


    Womöglich sind die Windows von Firefox aber auch Marke Eigenbau...

  • Ich habe noch eine Möglichkeit gefunden, das aktive Fenster zu ermitteln:

  • Wir hatten vor einigen Wochen einen User, der das zuletzt aktive Window ermitteln wollte, weil sein Send() oder so sonst nicht da ankommt, wo er es will... dann habe ich gebastelt und es war irgendwas mit Hook oder Register, um die Nachrichten abzufangen, wenn sich im System etwas an einem Window ändert... neu erstellt, vernichtet, Z-Order geändert... aber ich finde es einfach nicht mehr. Grrr...

    Jetzt habe ich es wieder gefunden...