dgb
asked on
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.
Not that i have to capture all the different mousemove events from all the objects on the form.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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
That's pretty cool Idle Mind, that sample's going in the file!
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.
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
ASKER
Thanks, only pitty that activeform doesn't work when in debugmode
"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.
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.
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.