Mit dem
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
und ihre Verwendung
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).
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.
VB.NET-Quellcode
- Imports System.ComponentModel
- Public Class MessageEvent : Inherits CancelEventArgs : Implements IMessageFilter
- Public Event Messaging As EventHandler(Of MessageEvent)
- Public Message As Message
- Public Sub New()
- Application.AddMessageFilter(Me)
- End Sub
- Private Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
- Cancel = False
- Message = m
- RaiseEvent Messaging(Me, Me)
- Return Cancel
- End Function
- End Class
VB.NET-Quellcode
- Imports System.Drawing
- Public Class frmMouseOverApplication
- Private WithEvents _MouseLogger As New MessageEvent
- Const WM_MOUSEMOVE As Integer = 512
- Private Sub _MouseLogger_Messaging(ByVal sender As Object, ByVal e As MessageEvent) Handles _MouseLogger.Messaging
- If e.Message.Msg <> WM_MOUSEMOVE Then Return
- Dim pt = New Point(e.Message.LParam.ToInt32)
- Dim ctl = Control.FromHandle(e.Message.HWnd)
- pt = ctl.PointToScreen(pt)
- Console.WriteLine(pt.ToString())
- End Sub
- 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).