In Visual C# .NET einen Windows-Hook festlegen

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 318804 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Eine Microsoft Visual Basic-Version dieses Artikels finden Sie unter 319524.
Alles erweitern | Alles schließen

Auf dieser Seite

Einführung

Dieser Artikel beschreibt einen Hook festlegen, der für einen Thread und das Hook-Prozedur wird mithilfe der Mausanschluss als Beispiel. Mit Hooks können Sie bestimmte Arten von Ereignissen überwachen. Sie können diese Ereignisse mit einem bestimmten Thread oder alle Threads in dem gleichen Desktop als ein aufrufender Thread zuordnen.

Weitere Informationen

Festlegen eines Mausanschluss

Rufen Sie die Funktion der Anwendung aus der Datei "User32.dll", um einen Hook festzulegen. Diese Funktion wird eine anwendungsdefinierte Hook-Prozedur in der Hook-Kette, die mit dem Hook ist, installiert.

Um einen Mausanschluss festzulegen und die Mausereignisse zu überwachen, gehen Sie folgendermaßen vor:
  1. Starten Sie Microsoft Visual Studio .NET.
  2. Klicken Sie im Menü Datei auf neuund klicken Sie dann auf Projekt.
  3. Klicken Sie unter Projekttypenauf Visual C#-Projekte im Dialogfeld Neues Projekt , und klicken Sie unter Vorlagenauf Windows-Anwendung . Geben Sie im Feld NameThreadSpecificMouseHook. Standardmäßig wird ein Formular mit dem Namen Form1 erstellt.
  4. Fügen Sie die folgende Codezeile in der Datei "Form1.cs" nach den anderen using -Anweisungen hinzu.
    using System.Runtime.InteropServices;
  5. Fügen Sie folgenden Code in der Klasse Form1 hinzu.
    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 den folgenden Code in der 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 .
    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 auf die Schaltfläche auf das Formular, den Haken setzen. Die Mauskoordinaten werden auf der Titelleiste des Formulars, wenn der Zeiger bewegt sich auf dem Formular. Klicken Sie auf die Schaltfläche erneut, um das Häkchen zu entfernen.

Globale Hooks werden in das.NET Framework nicht unterstützt.

Mit Ausnahme der WH_KEYBOARD_LL auf niedriger Ebene Hook und der WH_MOUSE_LL Low-Level-Hook können nicht Sie globale Hooks in das Microsoft.NET Framework implementieren. Um einen globalen Hook zu installieren, benötigen ein Hook eine systemeigene DLL exportieren nach selbst in einem anderen Prozess zu injizieren, die eine Funktion ungültig, konsistente zum Aufrufen von benötigt. Dies erfordert einen DLL-Export. Das.NET Framework unterstützt keine DLL-Exporten. 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 auf dem Thread aufgerufen, die den Hook installiert. Low-Level-Hooks erfordern nicht, dass die Hook-Prozedur in einer DLL implementiert werden.

Informationsquellen

Weitere Informationen über Hooks finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:
http://msdn.Microsoft.com/en-us/library/ms632589 (VS. 85

Eigenschaften

Artikel-ID: 318804 - Geändert am: Samstag, 23. November 2013 - Version: 5.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Keywords: 
kbhowtomaster kbmt KB318804 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 318804
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com