Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Interception de tous les événements

1 réponse
Avatar
Vivien Parlat
Bonjour,

J'essaie dans le cadre de tests persos de cr=E9er une appli du style de
Fiddler, bas=E9e sur l'id=E9e suivante: un webBrowser est inclus dans une
winform, et je veux afficher tous les =E9v=E9nements d=E9clench=E9s sur ce
composant. Pour ce faire, j'imagine qu'il faut affecter un event
handler commun =E0 tous les =E9v=E9nements. Je suis parvenu =E0 obtenir la
liste de tous les =E9v=E9nements via la ligne suivante:

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

Cependant je ne trouve pas comment r=E9utiliser cette liste de
MemberInfo pour affecter mon gestionnaire =E0 tous les =E9v=E9nements g=E9r=
=E9s.

Je pr=E9cise, l'id=E9e n'est pas de faire un hook pour les =E9vts clavier/
souris, ms pour tous les =E9v=E9nements internes g=E9r=E9s (page charg=E9e,
t=E9l=E9chargement avanc=E9, & co.)

Merci d'avance pour toute aide :)

1 réponse

Avatar
Gilles Kohl [MVP]
On Tue, 26 Feb 2008 01:37:29 -0800 (PST), Vivien Parlat
wrote:

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)