本文說明如何設定執行緒與勾點程序特定的勾點。本文將以滑鼠勾點為例。
您可以使用勾點監視某些類型的事件。您可以建立這些事件與特定執行緒的關聯,或是將相同桌面中的所有執行緒當作一個呼叫執行緒,建立這些事件與該執行緒的關聯。
設定滑鼠勾點
如果要設定勾點,請呼叫 User32.dll 檔的
SetWindowsHookEx 函數。這個函數會在與勾點關聯的勾點鏈結中安裝應用程式定義的勾點程序。
如果要設定滑鼠勾點並監視滑鼠事件,請依照下列步驟執行:
- 啟動 Microsoft Visual Studio .NET。
- 在 [檔案] 功能表上,指向 [新增],然後按一下
[專案]。
- 在 [新專案] 對話方塊中,按一下 [專案類型]
下的 [Visual Basic 專案]。然後,按一下 [範本] 下的
[Windows 應用程式]。
- 在 [名稱] 方塊中,輸入
ThreadSpecificMouseHook。根據預設,會建立名為 Form1 的表單。
- 在 Form1.vb 檔案的開頭,貼上下列程式碼。
Imports System.Runtime.InteropServices
Public Delegate Function CallBack( _
ByVal nCode As Integer, _
ByVal wParam As IntPtr, _
ByVal lParam As IntPtr) As Integer - 在 Form1 類別中,貼上下列程式碼。
'Declare the mouse hook constant.
'For other hook types, obtain these values from Winuser.h in Microsoft SDK.
Dim WH_MOUSE As Integer = 7
Shared hHook As Integer = 0
'Keep the reference so that the delegate is not garbage collected.
Private hookproc As CallBack
'Import for the SetWindowsHookEx function.
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function SetWindowsHookEx _
(ByVal idHook As Integer, ByVal HookProc As CallBack, _
ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
End Function
'Import for the CallNextHookEx function.
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function CallNextHookEx _
(ByVal idHook As Integer, ByVal nCode As Integer, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
End Function
'Import for the UnhookWindowsHookEx function.
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function UnhookWindowsHookEx _
(ByVal idHook As Integer) As Boolean
End Function
'Point structure declaration.
<StructLayout(LayoutKind.Sequential)> Public Structure Point
Public x As Integer
Public y As Integer
End Structure
'MouseHookStruct structure declaration.
<StructLayout(LayoutKind.Sequential)> Public Structure MouseHookStruct
Public pt As Point
Public hwnd As Integer
Public wHitTestCode As Integer
Public dwExtraInfo As Integer
End Structure - 新增按鈕至表單中。然後,將下列程式碼貼入 button1_click 程序中。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If hHook.Equals(0) Then
hookproc = AddressOf MouseHookProc
hHook = SetWindowsHookEx(WH_MOUSE, _
hookproc, _
IntPtr.Zero, _
AppDomain.CurrentDomain.GetCurrentThreadId())
If hHook.Equals(0) Then
MsgBox("SetWindowsHookEx Failed")
Return
Else
Button1.Text = "UnHook Windows Hook"
End If
Else
Dim ret As Boolean = UnhookWindowsHookEx(hHook)
If ret.Equals(False) Then
MsgBox("UnhookWindowsHookEx Failed")
Return
Else
hHook = 0
Button1.Text = "Set Windows Hook"
Me.Text = "Mouse Hook"
End If
End If
End Sub - 在 Form1 類別中,貼上 MouseHookProc 函數的下列程式碼。
Public Shared Function MouseHookProc( _
ByVal nCode As Integer, _
ByVal wParam As IntPtr, _
ByVal lParam As IntPtr) As Integer
Dim MyMouseHookStruct As New MouseHookStruct()
Dim ret As Integer
If (nCode < 0) Then
Return CallNextHookEx(hHook, nCode, wParam, lParam)
End If
MyMouseHookStruct = CType(Marshal.PtrToStructure(lParam, MyMouseHookStruct.GetType()), MouseHookStruct)
Dim tempForm As Form
tempForm = Form.ActiveForm()
Dim strCaption As String
strCaption = "x = " & MyMouseHookStruct.pt.x & " y = " & MyMouseHookStruct.pt.y
tempForm.Text = strCaption
Return CallNextHookEx(hHook, nCode, wParam, lParam)
End Function - 按 F5
以執行專案。按一下表單上的按鈕以設定勾點。當指標在表單上移動時,表單標題列上會出現指標座標。
- 再按一下按鈕以移除勾點。
.NET Framework 中不支援全域勾點
Microsoft .NET Framework 中無法實作全域勾點。如果要安裝全域勾點,勾點必須具有原生 DLL
匯出,以將其自身插入需要呼叫有效且一致之函數的另一個處理程序中。這個行為需要 DLL 匯出。.NET Framework 不支援 DLL 匯出。Managed
程式碼沒有函數指標值一致的概念,因為這些函數指標是動態建置的 Proxy。
如需有關勾點的詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站: