IMessageFilter

  • VB.NET

    IMessageFilter

    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:

    Quellcode

    1. Private Function PreFilterMessage(ByRef m As _
    2. System.Windows.Forms.Message) As Boolean Implements _
    3. System.Windows.Forms.IMessageFilter.PreFilterMessage
    4. Debug.WriteLine(m.Msg.ToString)
    5. ' Message = WM_KEYDOWN
    6. If m.Msg = &H100 Then
    7. Select Case m.WParam.ToInt32
    8. Case &H26 'Up
    9. OnKeyDown(New KeyEventArgs(Keys.Up))
    10. Return True
    11. Case &H28 'Down
    12. OnKeyDown(New KeyEventArgs(Keys.Down))
    13. Return True
    14. Case &H25 'Left
    15. OnKeyDown(New KeyEventArgs(Keys.Left))
    16. Return True
    17. Case &H27 'right
    18. OnKeyDown(New KeyEventArgs(Keys.Right))
    19. Return True
    20. End Select
    21. End If
    22. ' Nachrichtenbearbeitung fortsetzen
    23. Return False
    24. 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?


    Quellcode

    1. 'Button 1 Frame vorwärts
    2. Private Sub btnStepFwd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStepFwd.Click
    3. performStepFwd()
    4. End Sub


    --> alle Anweisungen in performStepFwd() funktionieren

    Quellcode

    1. Private Sub Vorschau_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    2. If e.KeyCode = Keys.Escape Then
    3. Me.Close()
    4. ElseIf e.KeyCode = Keys.Left Then
    5. Me.performStepRew()
    6. ElseIf e.KeyCode = Keys.Right Then
    7. Me.performStepFwd()
    8. End If
    9. 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