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:
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.)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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:
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:
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:
(Please reply to the group, not via email. Find my MVP profile with past articles / downloads here: http://www.gilleskohl.de/mvpprofile.htm)
On Tue, 26 Feb 2008 01:37:29 -0800 (PST), Vivien Parlat
<pocky6@gmail.com> 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:
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:
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:
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:
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:
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: