Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

Comment faire pour définir un hook Windows dans Visual C# .NET

IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d’une traduction incorrecte du contenu ou de son utilisation par les clients.

La version anglaise de cet article est la suivante: 318804
Pour obtenir une version Microsoft Visual Basic de cet article, reportez-vous à la section. 319524.
Introduction
Cet article décrit comment définir un hook qui est spécifique à un thread et à une procédure de hook en utilisant le raccordement de la souris comme un exemple. Vous pouvez utiliser des crochets pour surveiller certains types d'événements. Vous pouvez associer ces événements avec un thread spécifique ou avec tous les threads dans le même bureau comme un thread d'appel.
Plus d'informations

Définir un hook de souris

Pour définir un hook, appelez la fonction SetWindowsHookEx à partir du fichier User32.dll. Cette fonction installe une procédure de hook défini par l'application dans la chaîne de raccordement qui est associée avec le hook.

Pour définir un hook de souris et de surveiller les événements de souris, procédez comme suit :
  1. Démarrez Microsoft Visual Studio .NET.
  2. Dans le menu fichier , pointez sur Nouveau, puis cliquez sur projet.
  3. Dans la boîte de dialogue Nouveau projet , cliquez sur Projets Visual C# sous Types de projets, puis cliquez sur Application Windows sous modèles. Dans la zone nom , tapez ThreadSpecificMouseHook. Par défaut, un formulaire appelé Form1 est créé.
  4. Ajoutez la ligne de code suivante dans le fichier Form1.cs après les autres instructions de l'aide .
    using System.Runtime.InteropServices;
  5. Ajoutez le code dans la classe Form1 suivant.
    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. Ajoutez un contrôle bouton au formulaire, puis ajoutez le code suivant dans la procédure Button1_click .
    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. Dans la classe Form1 , ajoutez le code suivant pour la fonction MouseHookProc .
    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. Appuyez sur F5 pour exécuter le projet. Cliquez sur le bouton du formulaire afin de définir le raccordement. Les coordonnées de la souris s'affichent dans la barre de légende du formulaire lorsque le pointeur se déplace sur l'écran. Cliquez sur le bouton Nouveau pour supprimer le hook.

Points d'accueil globaux ne sont pas pris en charge dans le.NET Framework

À l'exception du hook de bas niveau de WH_KEYBOARD_LL et le hook de bas niveau WH_MOUSE_LL, Impossible d'implémenter des raccordements globales dans le Microsoft.NET Framework. Pour installer un hook global, un raccordement doit avoir une exportation de DLL native d'injecter lui-même dans un autre processus qui nécessite une fonction valide et cohérente pour appeler. Ce comportement implique une exportation de DLL. Le.NET Framework ne gère pas les exportations de DLL. Le code managé n'a aucun concept d'une valeur conforme pour un pointeur de fonction parce que les pointeurs fonction sont des proxys générés dynamiquement.

Procédures hook de bas niveau sont appelés sur le thread qui a installé le hook. Raccordements de bas niveau ne nécessitent pas que la procédure de raccordement est implémenté dans une DLL.
Références
Pour plus d'informations sur les hooks, visitez le site Web de Microsoft Developer Network (MSDN) à l'adresse suivante :

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 318804 - Dernière mise à jour : 07/03/2015 21:29:00 - Révision : 4.0

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 Initiation, Microsoft Visual C# .NET 2002 Initiation

  • kbhowtomaster kbmt KB318804 KbMtfr
Commentaires
cript> y: none; " src="https://c1.microsoft.com/c.gif?DI=4050&did=1&t=">050&did=1&t=">