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

Traductions disponibles Traductions disponibles
Numéro d'article: 318804 - Voir les produits auxquels s'applique cet article
Pour une version de Microsoft Visual Basic de cet article, voir 319524.
Agrandir tout | Réduire tout

Sommaire

Introduction

Cet article explique comment définir un hook qui est spécifique à un thread et à une procédure de hook en utilisant le point de raccordement de souris comme un exemple. Vous pouvez utiliser crochets pour contrôler certains types d'événements. Vous pouvez associer ces événements avec un thread spécifique ou toutes les threads dans le même bureau comme un thread d'appel.

Plus d'informations

Définir un point de raccordement 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 hook est associée le hook.

Pour définir un point de raccordement de souris et pour 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 projet , puis cliquez sur application Windows sous modèles . Dans la zone Nom , tapez ThreadSpecificMouseHook . Par défaut, un formulaire est nommé Form1 est créé.
  4. Ajoutez la ligne suivante de code dans le fichier Form1.cs après l'autre à l'aide de relevés.
    using System.Runtime.InteropServices;
  5. Ajouter après le code dans le class. 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);
    [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] extern statique publique int CallNextHookEx (idHook int, int nCode, wParam IntPtr, IntPtr lParam) ;
  6. Ajouter un contrôle bouton au formulaire et ajoutez ensuite 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";
    	} 
    }
    If(RET == False) {MessageBox.Show (UnhookWindowsHookEx " Échec"); return;} hHook = 0; button1.Text = "définir des crochet Windows;" this.Text = « souris CROCHET »;}}
  7. Ajoutez le code suivant de la fonction MouseHookProc dans le class. 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. Appuyez sur F5 pour exécuter le projet. Cliquez sur le bouton sur le formulaire pour définir le hook. Les coordonnées de la souris apparaissent dans la barre de légende formulaire lorsque le pointeur se déplace sur le formulaire. Cliquez sur le bouton nouveau pour supprimer le crochet.

Accroches globales non prises en charge dans le .NET Framework

Sauf pour le hook de bas niveau WH_KEYBOARD_LL et le hook de bas niveau WH_MOUSE_LL, vous ne peut pas implémenter accroches globales dans le Microsoft .NET Framework. Pour installer un hook global, un hook doit être une exportation DLL native pour injecter lui-même dans un autre processus nécessite une fonction valide et cohérente pour l'appeler. Ce problème nécessite une exportation DLL. Le .NET Framework ne prend pas en charge DLL exporte. Code managé n'a aucun concept d'une valeur cohérente pour un pointeur fonction car ces pointeurs fonction sont des proxys sont créées dynamiquement.

Procédures hook de bas niveau sont appelées sur le thread qui a installé le hook. Accroches de bas niveau ne requièrent pas que la procédure de hook être implémenté dans une DLL.

Références

Pour plus d'informations sur les points de raccordement, reportez-vous au site de Web MSDN (Microsoft Developer Network) suivant :
http://msdn.microsoft.com/en-us/library/ms632589(VS.85).aspx

Propriétés

Numéro d'article: 318804 - Dernière mise à jour: lundi 11 décembre 2006 - Version: 3.6
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • 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
Mots-clés : 
kbmt kbhowtomaster KB318804 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 318804
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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