Solved

Formwide mousemove

Posted on 2008-10-08
7
1,520 Views
Last Modified: 2013-11-05
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
Comment
Question by:dgb
7 Comments
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 250 total points
ID: 22669658
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
 
LVL 18

Expert Comment

by:mdougan
ID: 22669661
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
 
LVL 11

Expert Comment

by:ladarling
ID: 22669691
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
VMware Disaster Recovery and Data Protection

In this expert guide, you’ll learn about the components of a Modern Data Center. You will use cases for the value-added capabilities of Veeam®, including combining backup and replication for VMware disaster recovery and using replication for data center migration.

 
LVL 18

Expert Comment

by:mdougan
ID: 22669714
That's pretty cool Idle Mind, that sample's going in the file!
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 22670308
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
 

Author Closing Comment

by:dgb
ID: 31504245
Thanks, only pitty that activeform doesn't work when in debugmode
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 22678774
"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

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

If you're writing a .NET application to connect to an Access .mdb database and use pre-existing queries that require parameters, you've come to the right place! Let's say the pre-existing query(qryCust) in Access takes a Date as a parameter and l…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Along with being a a promotional video for my three-day Annielytics Dashboard Seminor, this Micro Tutorial is an intro to Google Analytics API data.
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question