Alle WindowMessages der Anwendung filtern

    • .NET (FX) 1.0–2.0
    • VB.NET

      Alle WindowMessages der Anwendung filtern

      Mit dem IMessageFilter-Interface kann man alle WindowMessages, die an iein Control der Anwendung gehen, abhorchen, abfangen, manipulieren.
      Muss man natürlich sparsam einsetzen, denn - etwa bei Mausbewegungen - sind das sehr viele, und wenn man da kompliziertes Zeugs anfängt, hat man seine Anwendung sehr schnell sehr langsam gemacht.

      Als Beispiel logge ich einfach mal alle MouseMoves über dem Haupt-Formular ins Output-Window.
      Das ist sonst ja ein Problem, denn wenn ein anderes Control auf dem Formular liegt, erreicht das MouseMove ja nicht mehr das Form.
      die Klasse

      VB.NET-Quellcode

      1. Imports System.ComponentModel
      2. Public Class MessageEvent : Inherits CancelEventArgs : Implements IMessageFilter
      3. Public Event Messaging As EventHandler(Of MessageEvent)
      4. Public Message As Message
      5. Public Sub New()
      6. Application.AddMessageFilter(Me)
      7. End Sub
      8. Private Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
      9. Cancel = False
      10. Message = m
      11. RaiseEvent Messaging(Me, Me)
      12. Return Cancel
      13. End Function
      14. End Class
      und ihre Verwendung

      VB.NET-Quellcode

      1. Imports System.Drawing
      2. Public Class frmMouseOverApplication
      3. Private WithEvents _MouseLogger As New MessageEvent
      4. Const WM_MOUSEMOVE As Integer = 512
      5. Private Sub _MouseLogger_Messaging(ByVal sender As Object, ByVal e As MessageEvent) Handles _MouseLogger.Messaging
      6. If e.Message.Msg <> WM_MOUSEMOVE Then Return
      7. Dim pt = New Point(e.Message.LParam.ToInt32)
      8. Dim ctl = Control.FromHandle(e.Message.HWnd)
      9. pt = ctl.PointToScreen(pt)
      10. Console.WriteLine(pt.ToString())
      11. End Sub
      12. End Class

      Sowas kann nützlich sein, will man zB ein Fly-Out-Panel entwickeln - da muss ja ein Bereich definiert sein, der das FOP anzeigt, wenn die Maus da drüber steht.
      Interessant übrigens, dass das MouseMove auch gefeuert wird, ohne dass die Maus bewegt wurde (ca 1/s).
      Dateien