Interception de tous les événements

Le
Vivien Parlat
Bonjour,

J'essaie dans le cadre de tests persos de créer une appli du style de
Fiddler, basée sur l'idée suivante: un webBrowser est inclus dans une
winform, et je veux afficher tous les événements déclenchés sur ce
composant. Pour ce faire, j'imagine qu'il faut affecter un event
handler commun à tous les événements. Je suis parvenu à obtenir la
liste de tous les événements via la ligne suivante:

monWebBrowser.GetType().FindMembers(MemberTypes.Event,
BindingFlags.Default, null, null);

Cependant je ne trouve pas comment réutiliser cette liste de
MemberInfo pour affecter mon gestionnaire à tous les événements gér=
és.

Je précise, l'idée n'est pas de faire un hook pour les évts clavier/
souris, ms pour tous les événements internes gérés (page chargée,
téléchargement avancé, & co.)

Merci d'avance pour toute aide :)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles Kohl [MVP]
Le #12140521
On Tue, 26 Feb 2008 01:37:29 -0800 (PST), Vivien Parlat

Bonjour,

J'essaie dans le cadre de tests persos de créer une appli du style de
Fiddler, basée sur l'idée suivante: un webBrowser est inclus dans une
winform, et je veux afficher tous les événements déclenchés sur ce
composant. Pour ce faire, j'imagine qu'il faut affecter un event
handler commun à tous les événements. Je suis parvenu à obtenir la
liste de tous les événements via la ligne suivante:

monWebBrowser.GetType().FindMembers(MemberTypes.Event,
BindingFlags.Default, null, null);

Cependant je ne trouve pas comment réutiliser cette liste de
MemberInfo pour affecter mon gestionnaire à tous les événements gérés.



En principe, et je dis bien en principe, ce qu'il faut faire est
convertir le MemberInfo en un EventInfo (du moment qu'on est sûr d'en
avoir un sous la main), et d'utiliser la Methode "AddEventHandler" de
ce dernier pour ajouter un gestionnaire, par exemple comme ceci:

private void monWebBrowser_Event(object sender, EventArgs e)
{
// traitement ...
}

// ... initialisation
MemberInfo [] browserEvents monWebBrowser.GetType().FindMembers(MemberTypes.Event,
BindingFlags.Default, null, null);

foreach(MemberInfo memberInfo in browserEvents)
{
EventInfo eventInfo = memberInfo as EventInfo;
if(eventInfo != null)
{
eventInfo.AddEventHandler(monWebBrowser, new
EventHandler(monWebBrowser_Event));
}
}


Je précise, l'idée n'est pas de faire un hook pour les évts clavier/
souris, ms pour tous les événements internes gérés (page chargée,
téléchargement avancé, & co.)



Malheureusement, cela ne fonctionnera que pour quelques évènements -
ceux don't la signature est exactement "object, EventArgs". Tout le
reste, et dont les plus intéressants comme Navigating, Navigated etc.
diffèrent dans leur signature et vous aurez une exception en essayant
d'ajouter un gestionnaire "générique" non conforme au type de délégat
attendu.

Deux solutions possibles:

a) avoir autant de delegats qu'il y a de signatures (interessantes)
differentes, et differentier selon le second argument (cf.
GetAddMethod ou EventHandlerType).

b) utiliser des techniques de programmation dynamique comme dans cet
exemple:

http://msdn2.microsoft.com/en-us/library/ms228976.aspx

Regards,
Gilles [MVP].

(Please reply to the group, not via email.
Find my MVP profile with past articles / downloads here:
http://www.gilleskohl.de/mvpprofile.htm)
Publicité
Poster une réponse
Anonyme