Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1585
  • Last Modified:

Formwide mousemove

Is there a mousemove event that is for the whole form.
Not that i have to capture all the different mousemove events from all the objects on the form.
0
dgb
Asked:
dgb
1 Solution
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Sure...use the IMessageFilter Interface like this:
Public Class Form1
 
    Private WithEvents mf As New MyFilter
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Application.AddMessageFilter(mf)
    End Sub
 
    Private Sub mf_MouseMove() Handles mf.MouseMove
        If Me Is Form1.ActiveForm Then
            Dim clientPT As Point = Me.PointToClient(Cursor.Position)
            Debug.Print("WM_MOUSEMOVE: " & clientPT.ToString)
        Else
            ' ...WM_MOUSEMOVE is targeting a form other than this one...
        End If
    End Sub
 
    Private Class MyFilter
        Implements IMessageFilter
 
        Public Event MouseMove()
        Private Const WM_MOUSEMOVE As Integer = &H200
 
        Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
            Select Case m.Msg
                Case WM_MOUSEMOVE
                    RaiseEvent MouseMove()
 
            End Select
        End Function
 
    End Class
 
End Class

Open in new window

0
 
mdouganCommented:
I don't believe so.  In earlier versions of VB they had a form property called Form KeyPreview and if you set that to true, then the form received keydown and keypress events before those events fired for the individual components, but they didn't have anything similar for mousemove events.

It is possible to do, but you have to "hook" the window's window_procedure.  All events go through the window's procedure first.  That's a lot of Win API coding.  You can find some examples at Karl Peterson's website:

http://vb.mvps.org/samples/

Look for the one called HookMe.  I see another one there called MouseEvent that I'm not familiar with, but, it might have something for you as well.
0
 
ladarlingCommented:
You need to create a handler sub and assign the controls that you need to monitor to the Handles list, for example:
   Private Sub MonitorMouse(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _
    Me.MouseMove, Button1.MouseMove, Label1.MouseMove 'Etc
        'Your code here.
    End Sub

Open in new window

0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
mdouganCommented:
That's pretty cool Idle Mind, that sample's going in the file!
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
If you want to know what control you are over then you could do something like the below.

Note that it does have some quirks...for instance, it doesn't properly detect when you are over SubMenus in a MenuStrip.  Also, for MenuStrips and ToolStrips you don't what know what actual item you are over...just that you are over the Menu or ToolBar.  The code can be modified to handle these special case though using the GetItemAt() functions.
Public Class Form1
 
    Private WithEvents mf As New MyFilter
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Application.AddMessageFilter(mf)
    End Sub
 
    Private Sub mf_MouseMove() Handles mf.MouseMove
        If Form.ActiveForm Is Me Then
            Dim clientPT As Point
            Dim formPT As Point = Me.PointToClient(Cursor.Position)
            Dim ctlName As String
            Dim ctl As Control = FindControl(Me)
            If Not IsNothing(ctl) Then
                ctlName = ctl.Name
                clientPT = ctl.PointToClient(Cursor.Position)
            Else
                ctlName = Me.Name
                clientPT = Me.PointToClient(Cursor.Position)
            End If
            Debug.Print(ctlName & ": " & clientPT.ToString & "    Form: " & formPT.ToString)
        Else
            ' ...WM_MOUSEMOVE is targeting a form other than this one...
        End If
    End Sub
 
    Private Function FindControl(ByVal cont As Control) As Control
        Dim ctl As Control = cont.GetChildAtPoint(cont.PointToClient(Cursor.Position))
        If Not IsNothing(ctl) Then
            If ctl.HasChildren Then
                Dim subCtl As Control = FindControl(ctl)
                If Not IsNothing(subCtl) Then
                    Return subCtl
                Else
                    Return ctl
                End If
            Else
                Return ctl
            End If
        Else
            Return Nothing
        End If
    End Function
 
    Private Class MyFilter
        Implements IMessageFilter
 
        Public Event MouseMove()
        Private Const WM_MOUSEMOVE As Integer = &H200
 
        Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
            Select Case m.Msg
                Case WM_MOUSEMOVE
                    RaiseEvent MouseMove()
 
            End Select
        End Function
 
    End Class
 
End Class

Open in new window

0
 
dgbAuthor Commented:
Thanks, only pitty that activeform doesn't work when in debugmode
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
"only pitty that activeform doesn't work when in debugmode"

It worked fine for me in Debug mode!...   =\

When I had a different form active I didn't get messages in my Immediate window.  This was the case for you?  I was using VB.Net 2005 Express on a WinXP Pro system.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now