Wie man einen Windows hook in Visual C# erstellt.

Eine Microsoft Visual Basic-Version dieses Artikels finden Sie unter 319524 .

Einführung

Dieser Artikel beschreibt, wie einen Hook festgelegt, der für einen Thread und eine Hookprozedur ist mit der Maus so. Haken können Sie bestimmte Ereignisse überwachen. Sie können diese Ereignisse mit einem bestimmten Thread und alle Threads in dem gleichen Desktop als aufrufenden Thread zuordnen.

Weitere Informationen

Maus-Hook erstellen

Um einen Hook festzulegen, rufen Sie die Funktion der Anwendung in der Datei User32.dll. Diese Funktion installiert eine anwendungsdefinierte Hookprozedur Hook-Kette, die den Hook zugeordnet ist.

Eine Mausanschluss festlegen und Mausereignisse überwachen, gehen Sie folgendermaßen vor:

  1. Starten Sie Microsoft Visual Studio .NET.
  2. Klicken Sie im Menü Datei auf neu und klicken Sie dann auf Projekt.
  3. Klicken Sie im Dialogfeld Neues Projekt klicken Sie unter Projekttypenauf Visual C#-Projekte , und klicken Sie unter Vorlagenauf Windows-Anwendung . Geben Sie im Feld Name ThreadSpecificMouseHook. Standardmäßig wird ein Formular mit dem Namen Form1 erstellt.
  4. Fügen Sie die folgende Zeile Code in die Datei Form1.cs nach anderen mit Anweisungen.
    using System.Runtime.InteropServices;
  5. Fügen Sie folgenden Code in der Klasse Form1 .
    public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
    //Declare the hook handle as an int.
    static int hHook = 0;

    //Declare the mouse hook constant.
    //For other hook types, you can obtain these values from Winuser.h in the Microsoft SDK.
    public const int WH_MOUSE = 7;
    private System.Windows.Forms.Button button1;

    //Declare MouseHookProcedure as a HookProc type.
    HookProc MouseHookProcedure;

    //Declare the wrapper managed POINT class.
    [StructLayout(LayoutKind.Sequential)]
    public class POINT
    {
    public int x;
    public int y;
    }

    //Declare the wrapper managed MouseHookStruct class.
    [StructLayout(LayoutKind.Sequential)]
    public class MouseHookStruct
    {
    public POINT pt;
    public int hwnd;
    public int wHitTestCode;
    public int dwExtraInfo;
    }

    //This is the Import for the SetWindowsHookEx function.
    //Use this function to install a thread-specific hook.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
    CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,
    IntPtr hInstance, int threadId);

    //This is the Import for the UnhookWindowsHookEx function.
    //Call this function to uninstall the hook.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
    CallingConvention=CallingConvention.StdCall)]
    public static extern bool UnhookWindowsHookEx(int idHook);

    //This is the Import for the CallNextHookEx function.
    //Use this function to pass the hook information to the next hook procedure in chain.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
    CallingConvention=CallingConvention.StdCall)]
    public static extern int CallNextHookEx(int idHook, int nCode,
    IntPtr wParam, IntPtr lParam);
  6. Fügen Sie ein Button -Steuerelement auf das Formular, und fügen Sie folgenden Code in die Button1_click -Prozedur.
    private void button1_Click(object sender, System.EventArgs e){
    if(hHook == 0)
    {
    // Create an instance of HookProc.
    MouseHookProcedure = new HookProc(Form1.MouseHookProc);

    hHook = SetWindowsHookEx(WH_MOUSE,
    MouseHookProcedure,
    (IntPtr)0,
    AppDomain.GetCurrentThreadId());
    //If the SetWindowsHookEx function fails.
    if(hHook == 0 )
    {
    MessageBox.Show("SetWindowsHookEx Failed");
    return;
    }
    button1.Text = "UnHook Windows Hook";
    }
    else
    {
    bool ret = UnhookWindowsHookEx(hHook);
    //If the UnhookWindowsHookEx function fails.
    if(ret == false )
    {
    MessageBox.Show("UnhookWindowsHookEx Failed");
    return;
    }
    hHook = 0;
    button1.Text = "Set Windows Hook";
    this.Text = "Mouse Hook";
    }
    }
  7. Fügen Sie den folgenden Code für die MouseHookProc -Funktion in der Klasse Form1 hinzu.
    public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam){
    //Marshall the data from the callback.
    MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));

    if (nCode < 0)
    {
    return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    else
    {
    //Create a string variable that shows the current mouse coordinates.
    String strCaption = "x = " +
    MyMouseHookStruct.pt.x.ToString("d") +
    " y = " +
    MyMouseHookStruct.pt.y.ToString("d");
    //You must get the active form because it is a static function.
    Form tempForm = Form.ActiveForm;

    //Set the caption of the form.
    tempForm.Text = strCaption;
    return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    }
  8. Drücken Sie F5, um das Projekt auszuführen. Klicken Sie im Formular auf den Haken. Die Mauskoordinaten auf der Titelleiste des Formulars angezeigt, wenn der Mauszeiger auf dem Formular. Klicken Sie erneut, um das Häkchen zu entfernen.

Globale Hooks werden im .NET Framework nicht unterstützt.

Mit Ausnahme der WH_KEYBOARD_LL Low-Level-Hook und der WH_MOUSE_LL Low-Level-Hook können Sie keine globalen Hooks im Microsoft .NET Framework implementieren. Zur Installation eines globalen Hooks wird ein nativer DLL-Export benötigt, damit sich der Hook selbst über eine valide, konsistente Prozedur in einen anderen Prozess einklinken kann. Dies erfordert einen DLL-Export. .NET Framework unterstützt keine DLL-Exporte. Verwalteter Code hat kein Konzept für einen konsistenten Wert für einen Funktionszeiger da diese Funktionszeiger Proxys sind, die dynamisch erstellt werden.

Low-Level-Hook-Prozeduren werden Thread aufgerufen, die den Hook installiert. Low-Level-Hooks erfordern keine Hook-Prozedur in einer DLL implementiert werden.

Referenzen

Weitere Informationen zu Hooks finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:

Eigenschaften

Artikelnummer: 318804 – Letzte Überarbeitung: 16.01.2017 – Revision: 1

Feedback