Solved

Formwide mousemove

Posted on 2008-10-08
7
1,506 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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

 
LVL 18

Expert Comment

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

Expert Comment

by:Mike Tomlinson
Comment Utility
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
Comment Utility
Thanks, only pitty that activeform doesn't work when in debugmode
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
Comment Utility
"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

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Article by: Kraeven
Introduction Remote Share is a simple remote sharing tool, enabling you to see, add and remove remote or local shares. The application is written in VB.NET targeting the .NET framework 2.0. The source code and the compiled programs have been in…
I think the Typed DataTable and Typed DataSet are very good options when working with data, but I don't like auto-generated code. First, I create an Abstract Class for my DataTables Common Code.  This class Inherits from DataTable. Also, it can …
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

763 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

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now