如何使用VB.NET注册全局鼠标事件(移动、单击)?
对于我自己实现的轻量级远程服务应用程序(如RDP、TeamViewer),我需要监听系统(或全局)鼠标事件,如鼠标移动或左/右/中/等单击 我发现,有一个用于查询系统鼠标位置的托管接口/API:如何使用VB.NET注册全局鼠标事件(移动、单击)?,.net,vb.net,events,mouseevent,.net,Vb.net,Events,Mouseevent,对于我自己实现的轻量级远程服务应用程序(如RDP、TeamViewer),我需要监听系统(或全局)鼠标事件,如鼠标移动或左/右/中/等单击 我发现,有一个用于查询系统鼠标位置的托管接口/API: Dim pos As System.Drawing.Point = Windows.Forms.Cursor.Position Label1.Text = String.Format("Current Position: {0} - {1}", pos.X, pos.Y) 但是,类Windows.Fo
Dim pos As System.Drawing.Point = Windows.Forms.Cursor.Position
Label1.Text = String.Format("Current Position: {0} - {1}", pos.X, pos.Y)
但是,类Windows.Forms.Cursor
似乎没有事件,我可以注册/收听Private with events MyCurser As Windows.Forms.Cursor
没有任何带有句柄的列表
更清楚地说:我确实希望在我的应用程序外部跟踪鼠标事件(因此我自己表单的单击事件侦听器不适用),因为我的应用程序是一个远程服务应用程序,如RDP或TeamViewer,它只将鼠标事件(和显示)转发到远程计算机
是否有一种托管(.NET)方法可以将鼠标位置更改作为事件获取(并且不需要计时器来查询位置),以及用户是否已单击(正在单击)鼠标上的按钮(以及它是什么按钮)
附加问题:当鼠标移动/单击“事件”由另一个软件触发,而不是由实际操作鼠标的人触发时,您的解决方案是否有效。您可以使用名为“我的库”。它旨在帮助.NET开发人员以一种简单、正确的方式捕获和模拟鼠标和键盘输入
在看到并回答了太多的堆栈溢出问题之后,如果用户使用了不推荐的API,或者他们的p/Invoke签名在哪里消失了,我决定创建它,作为一种更为.NET友好的输入管理方式,并试图与用户从互联网上许多不同地方收集的唯一部分正确的代码作斗争
InputHelper围绕本机Windows API(WinAPI)构建,并利用、/和等函数来完成其工作
遗憾的是,它还远远没有完成,因为我只记录了鼠标和键盘挂钩,但是该库包含XML文档文件,其中包含解释其中每个函数的注释,当您键入代码时,IntelliSense会自动显示这些注释。因此,对于库的迷你文档和概览,您可以始终打开Visual Studio的对象浏览器(在任何类型或名称空间上按F12键,或转到View>Object Browser
)并在那里找到它
InputHelper目前由四个专业人员组成:
InputHelper.Hooks
:用于捕获系统范围鼠标和键盘输入的类。例如,这可以用来制作热键
InputHelper.Keyboard
:模拟物理(“真实”)键盘输入/按键笔划的方法
InputHelper.Mouse
:模拟物理鼠标输入的方法
InputHelper.WindowMessages
:在更虚拟的层次上模拟鼠标和键盘输入的方法。它利用窗口消息(Send-/PostMessage
),并可用于针对特定窗口
您正在寻找的是InputHelper.Hooks
,具体来说是InputHelper.Hooks.MouseHook
首先,在上下载库的编译版本,并将其添加为对项目的引用。为方便起见,请将InputHelperLib
命名空间导入要使用它的文件中:
Imports InputHelperLib
现在,创建鼠标挂钩的最简单方法是在类级别实例化MouseHook
类的实例:
Dim MouseHook As New InputHelper.Hooks.MouseHook
这将侦听鼠标事件,直到变量超出范围或您对其调用Dispose()
如果不想立即启动钩子,只要声明变量并在需要时初始化它即可
Dim MouseHook As InputHelper.Hooks.MouseHook
'Start the hook at the click of a button.
Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
If MouseHook Is Nothing Then
MouseHook = New InputHelper.Hooks.MouseHook
End If
End Sub
挂钩包括四个事件:
MouseDown
-当按下或按住鼠标按钮时发生
MouseMove
-当鼠标移动时发生
MouseUp
-释放鼠标按钮时发生
鼠标滚轮
-在滚动鼠标滚轮时发生
您可以使用订阅事件
示例MouseDown
事件处理程序:
Private Sub MouseHook_MouseDown(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
If e.Button = System.Windows.Forms.MouseButtons.Left AndAlso e.DoubleClick = True Then
MessageBox.Show("Left mouse button was double-clicked.")
End If
End Sub
Private Sub MouseHook_MouseMove(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
LogTextBox.AppendText("Mouse moved to (X: " & e.Location.X & ", Y: " & e.Location.Y & ")")
End Sub
示例MouseMove
事件处理程序:
Private Sub MouseHook_MouseDown(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
If e.Button = System.Windows.Forms.MouseButtons.Left AndAlso e.DoubleClick = True Then
MessageBox.Show("Left mouse button was double-clicked.")
End If
End Sub
Private Sub MouseHook_MouseMove(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
LogTextBox.AppendText("Mouse moved to (X: " & e.Location.X & ", Y: " & e.Location.Y & ")")
End Sub
示例鼠标滚轮
事件处理程序:
Private Sub MouseHook_MouseWheel(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
If e.Delta > 0 AndAlso e.ScrollDirection = InputHelper.Hooks.ScrollDirection.Vertical Then
MessageBox.Show("Mouse scrolled up")
End If
End Sub
现在你有了一个功能强大的全局鼠标挂钩
有关钩子及其事件参数的更多详细信息,请查看项目的
附加问题:当鼠标移动/点击“事件”由其他软件触发而不是由实际操作鼠标的人触发时,您的解决方案是否有效
是和否。这取决于其他软件如何触发事件。如果它使用SendInput
或类似方法来模拟实际的物理输入,则为是。如果它使用窗口消息以特定窗口为目标,则不会