IMessageFilter

drere

Grünschnabel
Hallo,

ich steh grad bissl aufm Schlauch und komm irgendwie nich weiter. Vielleicht habt Ihr ja ne Idee. Das Problem:

Ich Implementiere in meiner MDI-Anwendung in einem Fenster IMessageFilter um Tastatureingaben abzufangen:

Code:
Private Function PreFilterMessage(ByRef m As _
    System.Windows.Forms.Message) As Boolean Implements _
    System.Windows.Forms.IMessageFilter.PreFilterMessage

        Debug.WriteLine(m.Msg.ToString)
        ' Message = WM_KEYDOWN
        If m.Msg = &H100 Then
            Select Case m.WParam.ToInt32
                Case &H26 'Up
                    OnKeyDown(New KeyEventArgs(Keys.Up))
                    Return True
                Case &H28 'Down
                    OnKeyDown(New KeyEventArgs(Keys.Down))
                    Return True
                Case &H25 'Left
                    OnKeyDown(New KeyEventArgs(Keys.Left))
                    Return True
                Case &H27 'right
                    OnKeyDown(New KeyEventArgs(Keys.Right))
                    Return True
            End Select
        End If

        ' Nachrichtenbearbeitung fortsetzen
        Return False
    End Function

Wenn er anhand des PreFilterMessage das Ereignis OnKeyDown aufruft und in mein implementiertes Keydown-Ereignis des Forms springt, so kennt der alle private-Variablen nicht mehr. Das heißt z.B. wenn ich einen Videoplayer hab und der einen Framestepbutton besitzt, dann funktioniert der Framestep super, wenn ich auf den Button klicke. Nehme ich allerdings die Richtungstaste und die PreFilterMessage-Funktion wird durchlaufen, so kennt der viele Objekte in der FrameStep-Methode nichtmehr. Muss ich dann alle Objekte, die dort verwendet werden als shared definieren?


Code:
'Button 1 Frame vorwärts
    Private Sub btnStepFwd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStepFwd.Click
        performStepFwd()
    End Sub
--> alle Anweisungen in performStepFwd() funktionieren

Code:
    Private Sub Vorschau_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.Escape Then
            Me.Close()
        ElseIf e.KeyCode = Keys.Left Then
            Me.performStepRew()
        ElseIf e.KeyCode = Keys.Right Then
            Me.performStepFwd()
        End If
    End Sub
--> wird u.a. von PreFilterMessage aufgerufen
--> Anwendung stürzt ab, weil Anweisungen in performStepFwd() nicht ausgeführt werden können (Objekte und Variablen sind nicht gesetzt)

Wie kann ich das Problem umgehen?

Gruß ... Drea
 

Neue Beiträge

Zurück