Fenster aktivieren

    • Offizieller Beitrag

    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.

    • Offizieller Beitrag

    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.

    • Offizieller Beitrag

    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...

    • Offizieller Beitrag

    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

    • Offizieller Beitrag

    dann funktioniert es genau so, wie es soll

    Ja, hatte ich in Post #3 ja dann bemerkt.

    Ein Problem ist nur noch die Kontrolle, welches tatsächlich das Fenster ist, welches als aktiv betrachtet wird. GetForegroundWindow() liefert oft auch "0" als Ergebnis.

  • 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...

    • Offizieller Beitrag

    So bekommst du nur die Windows vom primären Desktop/Monitor.

    Ich beschäftige mich erst mal noch mit Testen aller möglichen Funktionen. Den Luxus mehrerer Monitore habe ich nicht (oder selten) und somit ist das in der Prioritätsliste weit unten. ;)

    • Offizieller Beitrag

    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...

    Einmal editiert, zuletzt von Bitnugger (10. Oktober 2020 um 23:04)