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 :)
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 :)

Poser une question


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));
}
}
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/li...28976.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)