Dieser Artikel beschreibt wie einen Hook festgelegt, der bestimmte, um einen Thread und eine Hookprozedur ist die Verwendung der Mausanschluss als Beispiel. 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 aufrufende Thread zuordnen.
Um einen Hook festzulegen, rufen Sie die SetWindowsHookEx -Funktion aus der Datei User32.dll. Diese Funktion installiert eine anwendungsdefinierte Hook-Prozedur in der Hook-Kette, die der Hook zugeordnet ist.
Gehen Sie folgendermaßen vor um einen Maus Hook festgelegt und die Mausereignisse überwachen:
Starten Sie Microsoft Visual Studio .NET.
Zeigen im Menü Datei auf neu , und klicken Sie dann auf Projekt .
Klicken Sie im Dialogfeld Neues Projekt klicken Sie unter Projekttypen auf Visual C#-Projekte , und klicken Sie dann unter Vorlagen auf Windows-Anwendung . Geben Sie im Feld Name ThreadSpecificMouseHook . Standardmäßig wird ein Formular, die mit dem Namen Form1 erstellt.
Fügen Sie die folgende Codezeile in die Datei Form1.cs nach der anderen mithilfe von Anweisungen.
using System.Runtime.InteropServices;
Fügen Sie folgenden Code in Form1 -class.
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);
Das Formular ein Button -Steuerelement hinzu, und fügen Sie folgenden Code in der Button1_Click -Prozedur. private void button1_Click(object sender, System.EventArgs e)
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";
}
}
Fügen Sie den folgenden Code für die MouseHookProc -Funktion in Form1 -class.
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);
}
}
Drücken Sie [F5], um das Projekt auszuführen. Klicken Sie auf das Formular der Hook festgelegt werden. Die Koordinaten der Maus werden auf der Formular-Titelleiste angezeigt, wenn der Zeiger bewegt sich auf dem Formular. Klicken Sie erneut, um den Hook zu entfernen.
Globale Hooks werden in .NET Framework nicht unterstützt.
Mit Ausnahme von der WH_KEYBOARD_LL-Low-Level-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, muss ein Hook eine systemeigene DLL exportieren in selbst in einem anderen Prozess zu injizieren, die eine gültige, einheitliche Funktion zum Aufrufen von benötigt haben. Dies erfordert eine DLL-Export. DLL-Exporte werden von .NET Framework nicht unterstützt. 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 ist nicht erforderlich, dass die Hook-Prozedur in einer DLL implementiert werden.
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:
kbmt kbhowtomaster KB318804 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 318804
(http://support.microsoft.com/kb/318804/en-us/
)
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.
Danke! Dieses Feedback hilft uns dabei, die Supportartikel weiter zu verbessern. Weitere Informationen finden Sie auf der Hilfe und Support-Startseite.