Verhindern, dass ein Fenster den fokus erhält



  • Hallo Forum,
    ich stehe vor folgendem Problem: Aus einem Fenster FormA öffne ich ein zweites Fenster (FormB). Für FormB gebe ich als ownerWindow FormA an, damit es immer im vordergrund bleibt. Gibt es eine Möglichkeit, FormB zu öffnen ohne dass FormA den Fokus verliert bzw. FormB grundsätlich davon abzuhalten den fokus überhaupt zu bekommen?
    Danke im voraus



  • Wenn du FormB deaktivierst (Enabled = false) kann es niemals den Fokus kriegen.
    Ansonsten kannst du nach dem Öffnen von FormB aber auch mit FormA.Focus() den Focus wieder umsetzen.



  • Auch mit Enabled = False erhält das zweite fenster den Fokus. Den Fokus zurückgeben ist auch nicht so das wahre - man sieht halt deutlich wie FormA inaktiv und wieder aktiv wird. Mal schauen was die WinApi so hergibt.



  • Herb schrieb:

    Mal schauen was die WinApi so hergibt.

    API: SetForegroundWindow( FormA.Handle ) im Load Ereignis von FormB implementieren.

    [MSDN: SetForegroundWindow Function]
    http://msdn2.microsoft.com/en-us/library/ms633539.aspx



  • Was ich vorhabe ist folgendes. Ich will eine Autocomplete Form und so eine Art ToolTip (Wie in VS - bei dem man die Methoden auswählen kann) implementieren. Die Form soll sich schließen, wenn die TextBox den Fokus verliert (auch wie in VS). Sobald ich aber die Form öffne (und sie den Fokus erhält) verliert meine Textbox logischerweise den Fokus und die zweite Form schließt sich sofort wieder.
    Ist zwar zu verhindern wenn man die beiden Forms fleißig kommunizieren lässt - WM_KILLFOCUS (LostFocus liefert zu wenig Infos) - aber ich kann mir nicht vorstellen, dass das der Weisheit letzter Schluss ist. Ich muss also die entweder die ChildForm davon abhalten überhaupt aktiv zu werden - die bessere Lösung, weil die ChildForm dann für jedes Steuerelement verwendet werden kann - oder ich muss die ParentForm dazu bringen, den Fokus in bestimmten Situationen nicht abzugeben - weniger schön aber geht auch. Muss doch irgendwie gehen, ein ToolTip funktioniert ja auch und ist nur ein ganz normales Fenster.



  • ShowWindow(hwnd, SW_SHOWNOACTIVATE);
    


  • SW_SHOWNOACTIVATE hilft leider auch nicht, weil das Fenster dadurch auch nicht in den Vordergrund gebracht wird. Habe mir jetzt so geholfen, dass das Fenster immer sichtbar ist, allerdings transparent und außerhalb des Bildschirms wenn es nicht zu sehen sein soll.
    Das ganze funktioniert jetzt also soweit, auch wenn ich mit der jetzigen Lösung alles andere als zufrieden bin. Danke für die Tipps.



  • Im Windows/Platform SDK gibt es ein Sample namens Fakemenu.



  • Vielen dank, scheint genau das zu sein was ich suche.


Anmelden zum Antworten