Zwei Forms mit Fokus

PhoenixLoe

Erfahrenes Mitglied
Hi Leute,

ich suche jetzt schon seit Stunden eine Lösung für mein Problem, habe aber nichts passendes gefunden.

Ich habe eine Anwendung mit einem Hauptfenster und mehreren Unterfenstern, die dem Hauptfenster über die Owner-Eigenschaft zugewiesen sind.
Das Problem ist nun, dass die untergeordneten Formulare dem Hauptfenster den Fokus stehlen, so dass das Hauptmenü und die Toolbar nicht mehr angesteuert werden können. So muss man beispielsweise zweimal auf einen Toolbar-Button drücken, um ihn zu aktivieren.

Ich habe es auch schon damit versucht, die WM_SETFOCUS-Nachricht in der WndProc-Methode abzufangen und den Fokus an das Hauptfenster zurückzusenden. Dabei ist allerdings das Problem, dass man nun das untergeordnete Fenster nicht mehr schließen kann, da der Fokus zu früh weg ist.

Ich bin mit meinem Latein am Ende. Gibt es vielleicht eine Möglichkeit, zwei Formulare mit einem Fokus auszustatten - ähnlich, wie es bei MDI der Fall ist (MDI eignet sich leider nicht für das Programm)?

Fröhliche Weihnachten und danke für eure Antworten!

Gruß
PhoenixLoe
 
OK, über globale HotKeys (IMessageFilter-Klasse) habe ich jetzt zumindest auf die Shortcuts des Hauptmenüs Zugriff, egal in welchem Fenster ich mich befinde. Allerdings muss ich nachwievor zweimal klicken, um das Menü zu öffnen oder die Toolbar zu bedienen.

Ich bin für alle Vorschläge offen!

Gruß
PhoenixLoe
 
Hallo nochmal zu meinem einsamen Monolog. :rolleyes:

Auch das Problem mit dem zweimaligen Klick ist mittlerweile gelöst. Der Trick besteht darin, die ToolStrip- und MenuStrip-Klasse zu erweitern und die WndProc-Methode ein bisschen anzupassen:

Code:
''' <summary>
''' Stellt ein erweitertes ToolStrip-Steuerelement dar.
''' </summary>
Public Class ToolStripEx : Inherits ToolStrip

    ''' <summary>
    ''' Erstellt ein neuen erweitertes ToolStrip-Steuerelement.
    ''' </summary>
    Public Sub New()

        ' An Basisklasse weiterleiten
        MyBase.New()

    End Sub


    ''' <summary>
    ''' Verarbeitet alle Windows-Meldungen.
    ''' </summary>
    ''' <param name="m">Nachricht</param>
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        ' An Basisklasse weiterleiten
        MyBase.WndProc(m)

        ' Nachricht überprüfen
        If m.Msg = WM_MOUSEACTIVATE AndAlso m.Result = MA_ACTIVATEANDEAT Then

            ' ToolStrip aktivieren
            m.Result = MA_ACTIVATE

        End If

    End Sub

End Class

Gruß
PhoenixLoe
 
Zurück