Come impostare un hook in Visual Basic .NET


Per la versione Microsoft Visual C# di questo articolo, vedere 318804 .

Riepilogo


In questo articolo viene descritto come impostare un hook specifico a un thread e a una routine di hook. In questo articolo viene utilizzato l'hook del mouse come un esempio.

È possibile utilizzare gli hook di monitorare determinati tipi di eventi. È possibile associare questi eventi con un thread specifico o con tutti i thread presenti lo stesso desktop come un thread chiamante.

Ulteriori informazioni


Impostare un hook del mouse

Per impostare un hook, chiamare la funzione SetWindowsHookEx dal file User32. dll. Questa funzione consente di installare una routine di hook definito dall'applicazione della catena di hook associato l'hook.

Per impostare un hook del mouse e per monitorare gli eventi del mouse, attenersi alla seguente procedura:

  1. Avviare Microsoft Visual Studio .NET.
  2. Dal menu File , scegliere Nuovo, quindi progetto.
  3. Nella finestra di dialogo Nuovo progetto scegliere Progetti di Visual Basic in Tipi progetto. Quindi, fare clic su Applicazione Windows in modelli.
  4. Nella casella nome digitare ThreadSpecificMouseHook. Per impostazione predefinita, viene creato un form denominato Form1.
  5. All'inizio del file Form1. vb, incollare il codice riportato di seguito.
    Imports System.Runtime.InteropServicesPublic Delegate Function CallBack( _
    ByVal nCode As Integer, _
    ByVal wParam As IntPtr, _
    ByVal lParam As IntPtr) As Integer
  6. Nella classe Form1 , incollare il codice riportato di seguito.
    '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. Aggiungere un pulsante al form. Quindi, incollare il codice seguente nella routine 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. Nella classe Form1 , incollare il seguente codice per la funzione 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. Premere F5 per eseguire il progetto. Fare clic sul pulsante sul form per impostare l'hook. Le coordinate del puntatore vengono visualizzati sulla barra del titolo del form quando si sposta il puntatore del mouse sul form.
  10. Fare clic sul pulsante per rimuovere l'hook.

Hook globali non supportati di.NET Framework

Non è possibile implementare hook globale di.NET Framework. Hook di basso livello eseguiti nel processo del chiamante. Gli hook non richiedono che venga introdotto codice in altri processi. Possono essere implementati nel codice gestito, ma potrebbe non continuano a funzionare. Poiché ogni evento di input deve attendere che venga restituita prima che l'hook viene inviato l'hook di basso livello, lente hook significativamente possono interferire con la capacità di risposta del sistema. Windows rimuove automaticamente qualsiasi hook che richiede troppo tempo per l'elaborazione. Poiché il codice gestito non è possibile controllare in quale fase viene eseguito il garbage collector, non è garantito che la routine di hook restituirà sempre sufficientemente rapido per evitare la rimozione.

Riferimenti


Per ulteriori informazioni su hook, visitare il seguente sito Web Microsoft Developer Network (MSDN):