[英]How to register to global mouse events (move, click) with VB.NET?
對於我自己的輕量級遠程服務應用程序(如 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.Forms.Cursor
似乎沒有事件,我可以注冊/收聽。 Private WithEvents MyCurser As Windows.Forms.Cursor
沒有任何包含Handles
列表。
更清楚地說:我確實想在我的應用程序之外跟蹤鼠標事件(因此我自己的表單的單擊事件偵聽器不適用),因為我的應用程序是一個遠程服務應用程序,如 RDP 或 TeamViewer,它只轉發鼠標事件(以及顯示)到遠程計算機。
是否有一種托管(.NET) 方法可以將鼠標位置更改為事件(並且不需要計時器來查詢位置),以及用戶是否已單擊(正在單擊)鼠標上的按鈕(以及它是什么按鈕)?
額外問題:當鼠標移動/點擊“事件”是由另一個軟件而不是由實際操作鼠標的人觸發時,您的解決方案是否有效。
您可以使用我的名為InputHelper的庫。 它旨在幫助.NET開發人員以簡單且正確的方式捕獲和模擬鼠標和鍵盤輸入。
在看到並回答了太多的堆棧溢出問題后,用戶要么使用了已棄用的API,要么在哪里使用了P / Invoke簽名,然后我決定將其創建為一種更加.NET友好的方式來管理輸入和嘗試與用戶從互聯網上許多不同地方收集的唯一部分正確的代碼作斗爭。
InputHelper圍繞本機Windows API(WinAPI)構建,並利用諸如SendInput()
, SendMessage()
/ PostMessage()
和SetWindowsHookEx()
的功能來完成其工作。
可悲的是,它的Wiki還遠遠不夠完善,因為我只記錄了鼠標和鍵盤掛鈎,但是該庫包含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
在釋放鼠標按鈕時發生。
MouseWheel
滾動鼠標滾輪時發生。
您可以使用AddHandler
語句訂閱事件。
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
AddHandler MouseHook.MouseDown, AddressOf MouseHook_MouseDown
AddHandler MouseHook.MouseMove, AddressOf MouseHook_MouseMove
AddHandler MouseHook.MouseWheel, AddressOf MouseHook_MouseWheel
End If
End Sub
示例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
示例MouseMove
事件處理程序:
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
示例MouseWheel
事件處理程序 :
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
現在,您有了一個有效的全局鼠標鈎!
有關鈎子及其事件args的更多詳細信息,請查看項目的wiki 。
額外的問題:當鼠標移動/單擊“事件”是由另一個軟件而不是由實際操作鼠標的人員觸發時,您的解決方案是否有效?
是的,沒有。 這取決於其他軟件如何觸發事件。 如果它使用SendInput
或類似方法模擬實際的物理輸入, SendInput
是。 如果它使用窗口消息來定位特定窗口,則否。
非常感謝。
我在互聯網上的任何地方都找不到適用於 Visual Basic 的 Hooking Lib。 而且不幸的是,我無法將 C# 代碼轉換為 VB 代碼。 但是這個 Lib 和示例是完美的 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.