文章編號: 319524 - 上次校閱: 2011年1月5日 - 版次: 2.0

如何在 Visual Basic .NET 中設定勾點

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
如需本文的 Microsoft Visual C# 版本,請參閱 318804? (http://support.microsoft.com/kb/318804/ )

在此頁中

全部展開 | 全部摺疊

結論

本文說明如何設定執行緒與勾點程序特定的勾點。本文將以滑鼠勾點為例。

您可以使用勾點監視某些類型的事件。您可以建立這些事件與特定執行緒的關聯,或是將相同桌面中的所有執行緒當作一個呼叫執行緒,建立這些事件與該執行緒的關聯。

其他相關資訊

設定滑鼠勾點

如果要設定勾點,請呼叫 User32.dll 檔的 SetWindowsHookEx 函數。這個函數會在與勾點關聯的勾點鏈結中安裝應用程式定義的勾點程序。

如果要設定滑鼠勾點並監視滑鼠事件,請依照下列步驟執行:
  1. 啟動 Microsoft Visual Studio .NET。
  2. [檔案] 功能表上,指向 [新增],然後按一下 [專案]
  3. [新專案] 對話方塊中,按一下 [專案類型] 下的 [Visual Basic 專案]。然後,按一下 [範本] 下的 [Windows 應用程式]
  4. [名稱] 方塊中,輸入 ThreadSpecificMouseHook。根據預設,會建立名為 Form1 的表單。
  5. 在 Form1.vb 檔案的開頭,貼上下列程式碼。
    Imports System.Runtime.InteropServices
    Public Delegate Function CallBack( _
        ByVal nCode As Integer, _
        ByVal wParam As IntPtr, _
        ByVal lParam As IntPtr) As Integer
  6. 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
  7. 新增按鈕至表單中。然後,將下列程式碼貼入 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
  8. 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
  9. 按 F5 以執行專案。按一下表單上的按鈕以設定勾點。當指標在表單上移動時,表單標題列上會出現指標座標。
  10. 再按一下按鈕以移除勾點。

.NET Framework 中不支援全域勾點

Microsoft .NET Framework 中無法實作全域勾點。如果要安裝全域勾點,勾點必須具有原生 DLL 匯出,以將其自身插入需要呼叫有效且一致之函數的另一個處理程序中。這個行為需要 DLL 匯出。.NET Framework 不支援 DLL 匯出。Managed 程式碼沒有函數指標值一致的概念,因為這些函數指標是動態建置的 Proxy。

?考

如需有關勾點的詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站:
http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/AboutHooks.asp (http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/AboutHooks.asp)

這篇文章中的資訊適用於:
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
關鍵字:?
kbhowtomaster KB319524
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。