Hook localisé sur une application

Description

Probleme : comment empecher l'apparition du menu contextuel du controle "Navigateur Web Microsoft" (Internet Explorer) (accessible par clic droit sur boite a outils dans vs => ajouter/supprimer... => COM => cocher "Navigateur Web Microsoft") ?
Apparemment il n'y a rien de prevu pour désactiver ce fameux menu (en tout cas je n'ai pas trouver)

Donc une solution était d'"intercepter" le message "Clic droit" avant qu'il ne soit transmit à ce controle.

Ceci est possible via l'API Win par la mise en place d'un "hook", qui permet de recevoir et de traiter les messages avant qu'ils n'arrivent a leur destinataire. (et donc de le bloquer si justement on ne veut pas qu'il arrive)

Ici, celui qui nous interresse est celui qui touche à la souris : WH_MOUSE, mais il en existe de toutes sortes. (voir MSDN : SetWindowsHookEx pour la liste)

N'est traité ici que le hook localisé pour le thread de l'application (on ne recoit pas les messages MOUSE d'autres applis)

Pour bien montrer que le blocage du clic droit n'est fait que pour le controle IE, j'ai mit un menu contextuel sur le form : une fois la case cochée, celui de ie n'apparait plus, mais celui du form si.

ATTENTION : ce code est inspiré (et pour certaines parties copié) du HOW TO présenté en référence.

Source / Exemple :


//SetWindowsHookEx : Installer le hook
[DllImport("user32.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

//UnhookWindowsHookEx : Désinstaller le hook
[DllImport("user32.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
		
//CallNextHookEx : relancer le message intercepté
[DllImport("user32.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

MODIF (je ne met pas a jour le zip, pas vraiment necessaire) : 

[StructLayout(LayoutKind.Sequential)]
public class POINT 
{
	public int x;
	public int y;
}

ET

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

peuvent etre remplacés par : 
public struct POINT 
{
	public int x;
	public int y;
}
		
public struct MouseHookStruct 
{
	public POINT pt;
	public int hwnd;
	public int wHitTestCode;
	public int dwExtraInfo;
}

Conclusion :


Je n'ai pas compris le fonctionnement de [StructLayout(LayoutKind.Sequential)]
Je sais juste que si on ne le met pas rien ne fonctionne.
Si quelqu'un peut m'expliquer ^^

REFERENCES :

318804 - HOW TO: Set a Windows Hook in Visual C# .NET
http://support.microsoft.com/?kbid=318804

MSDN : SetWindowsHookEx
http://msdn.microsoft.com/en-us/library/ms644990.aspx

MSDN : UnhookWindowsHookEx
http://msdn.microsoft.com/en-us/library/ms644993.aspx

MSDN : CallNextHookEx
http://msdn.microsoft.com/en-us/library/ms644974.aspx

MSDN : MouseProc
http://msdn.microsoft.com/en-us/library/ms644988.aspx

MSDN : MOUSEHOOKSTRUCT
http://msdn.microsoft.com/en-us/library/ms644968.aspx

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.