Hook localisé sur une application

Soyez le premier à donner votre avis sur cette source.

Vue 15 286 fois - Téléchargée 656 fois

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

Ajouter un commentaire

Commentaires

Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
Hmmmm, regarde quand même du côté de IMessageFilter pour voir si ça ne suffit pas pour ton besoin, c'est beaucoup plus propre.
Messages postés
35
Date d'inscription
vendredi 15 février 2002
Statut
Membre
Dernière intervention
27 avril 2009

Meri pour cette exemple c'est tout a fait ce que je rechercher ;)
Messages postés
5
Date d'inscription
jeudi 17 avril 2003
Statut
Membre
Dernière intervention
24 novembre 2005

Ouin c clair.

De toute manière c'est une question de temps. La génération "2005" de .Net va finalement venir 'ec un contrôle WebBrowser descent.

Ça me révolte sincérement que Microsoft nous fournissent des contrôles merdeux ou / et à moitié terminés. Non mais c'est vrai ! Pensez-y, ça à prit combien de temps avant d'avoir un ComboBox qui fait vraiment la job, là je parle qu'il se rempli tout seul en lui fillant une entitée contenant des données brutes. Ne parlons même pas du TreeView, pas de sélection multiple ni de "Drag'n Drop".

Je ne m'embarque pas non plus, mais vraiment pas dans la beauté (style) même des contrôles offert VS ceux qu'utilise Micro$oft. J'crois que c'est le boute du boute !

Enfin,
j'suis content qu'ils en prennent plein la gueul depuis la venu de Mozilla FireFox. Un autre exemple. Internet Explorer est rendu à la version 6..., 6 ! Moi j'te dis entre la version 4 et 6 j'vois pas tant grandes différences. Ha oui, de l'amélioration de la sécurité... oui. Et les nouvelles fonctionnalités... ???

;) j'en ai gros sur le coeur à propos de ce genre de sujet !
Mais ça dépasse un peu le thread actuel.

Ouin bon, ben continons à gosser comme des mongoles sur des contrôles plus ou moins pourris.

Au fait, une chance que ce genre de site d'entraide existe, autrement on serait tous dans la merde... enfin, presque tous ;)

Bravo, beau travail !
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
Ce qui implique donc de rajouter le script à la volée à chaque page chargée par l'utilisateur.
Messages postés
5
Date d'inscription
jeudi 17 avril 2003
Statut
Membre
Dernière intervention
24 novembre 2005

eh les filles, utilisez du javascript genre :

<script language='JavaScript' type='text/javascript'>
<!--
function NRC(e) { if(navigator.appName=='Netscape') {
if(e.which==3||e.which==2) { return false; return true }}
else { event.cancelBubble=true; event.returnValue=false }}
if(navigator.appName=='Netscape') window.captureEvents(Event.MOUSEDOWN)
document.oncontextmenu=NRC; window.onmousedown=NRC;
self.focus();
// -->
</script>

Pour empêcher le clique droit, et voilà
Afficher les 8 commentaires

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.