Le blocage des boîtes de dialogue .NET contrôle WebBrowser
J'ai un .NET 2.0 contrôle WebBrowser utilisé pour naviguer sur certaines pages sans interaction de l'utilisateur (ne me demandez pas longue histoire...). En raison de l'utilisateur-moins de la nature de cette application, j'ai mis le contrôle WebBrowser ScriptErrorsSuppressed true à la propriété, dont la documentation fournie avec VS 2005 les états [...]"masquer tous ses boîtes de dialogue qui proviennent du sous-jacent contrôle ActiveX, pas juste des erreurs de script." Le Article MSDN ne parle pas de cela, cependant.
J'ai réussi à annuler l'événement NewWindow, ce qui empêche les popups, de sorte que c'est pris en charge.
Quelqu'un a une expérience à l'aide de l'un de ces et avec succès blocage tous boîtes de dialogue, les erreurs de script, etc?
MODIFIER
Ce n'est pas une instance autonome de IE, mais une instance d'un contrôle WebBrowser à vivre sur une application Windows Form. Quelqu'un a une expérience avec ce contrôle, ou le sous-jacente, AxSHDocVW?
ÉDITER à nouveau
Désolé, j'ai oublié de parler de ça... je suis en train de bloquer un JavaScript alert(), avec juste un bouton OK. Je peux peut-être jeté dans un IHTMLDocument2 objet et accéder aux scripts de cette façon, j'ai utilisé MSHTML un peu, quelqu'un sait?
Vous devez vous connecter pour publier un commentaire.
Cela est très certainement hacky, mais si vous le faites tout le travail avec le contrôle WebBrowser, vous trouverez vous-même faire beaucoup de hacky choses.
C'est la façon la plus simple que je connaisse pour ce faire. Vous avez besoin d'injecter du JavaScript pour remplacer la fonction d'alerte... quelque chose le long des lignes de l'injection de cette fonction JavaScript:
Il y a beaucoup de façons de faire, mais il est très possible de faire. Une possibilité est d'accrocher une mise en œuvre de la DWebBrowserEvents2 interface. Une fois que ceci est fait, vous pouvez brancher dans la NavigateComplete, le DownloadComplete, ou le DocumentComplete (ou, comme nous le faisons, de la variation de celle-ci) et puis appeler un InjectJavaScript méthode que vous avez mis en œuvre qui effectue cette surcharge de la fenêtre.alerte méthode.
Comme je l'ai dit, hacky, mais il fonctionne 🙂
Je peux aller plus dans les détails, si j'en ai besoin.
Et pour un moyen facile d'injecter que la magie de la ligne de javascript, lire comment injecter du code javascript dans le contrôle webbrowser.
Ou tout simplement utiliser ce code complet:
element
?Vous devez personnaliser certaines choses, de prendre un coup d'oeil à
IDocHostUIHandler
, puis découvrez quelques-unes des autres interfaces. Vous pouvez avoir une bonne quantité de contrôle, au point même de personnalisation de la boîte de dialogue affichage/ui (je ne me souviens pas de l'interface qui fait cela). Je suis sûr que vous pouvez faire ce que vous voulez, mais il ne nécessite nettoyage autour de dans les entrailles deMSHTML
et d'être en mesure de mettre en œuvre les différentsCOM
interfaces.Quelques autres idées:
http://msdn.microsoft.com/en-us/library/aa770041.aspx
Ceux-ci peuvent être des choses que vous êtes à la recherche à la mise en œuvre.
Pare-balles alerte bloquant:
Cet exemple suppose que vous avez Microsoft.mshtml référence ajoutée, "à l'aide de mshtml;" dans vos espaces de noms et Navigateur est votre WebBrowser instance.
Pourquoi est-il infaillible? Tout d'abord, il poignées de scripts à l'intérieur de cadres. Ensuite, il ne tombe pas en panne quand une "cadre killer" existe dans le document. Un "cadre killer" est une image qui soulève une exception à tenter de l'utiliser comme HtmlWindow objet. Tout "foreach" utilisé sur le Document.De la fenêtre.Les Frames serait la cause d'une exception, donc plus sûr "pour", la boucle doit être utilisé avec un bloc try /catch.
C'est peut-être pas le plus lisible morceau de code, mais il fonctionne avec la vie réelle, mal formé pages.
Juste à ajouter que de votre niveau d'entrée de la fonction. Après beaucoup de recherche, c'est quand je suis tombé sur cette méthode, et touche du bois jusqu'à maintenant, ses travaillé. Cheers!!
fenêtre.showModelessDialog et de la fenêtre.showModalDialog peut être bloquée par la mise en œuvre de INewWindowManager interface, en outre le code ci-dessous montrent comment bloquer les boîtes de dialogue d'alerte par la mise en œuvre de IDocHostShowUI
Je viens de publier un article sur le Projet de Code qui peut vous aider.
Consultez - http://www.codeproject.com/KB/shell/WebBrowserControlDialogs.aspx
Espère que cette aide.
La
InjectAlertBlocker
est tout à fait correctele code est
Des références nécessaires pour être ajouté est
Ajouter une référence à
MSHTML
, qui probalby être appelé "Microsoft HTML Object Library" sousCOM
références.Ajouter
using mshtml;
à vos espaces de noms.Obtenir une référence à votre script de l'élément
IHTMLElement
:Ensuite, vous pouvez utiliser le
Navigated
cas de webbrowser que:Êtes-vous essayer de mettre en œuvre un site web robot? J'ai peu d'expérience dans l'utilisation de l'hébergé IE contrôle, mais je n'ai terminé quelques Win32 projets essayé d'utiliser l'IE de contrôle. Désactiver les popups devrait être fait par les gestionnaires d'événement de la commande comme vous l'avez déjà fait, mais j'ai trouvé que vous avez aussi besoin de changer les "Désactiver le débogage de script xxxx" en plus de la barre d'options (ou vous pouvez modifier le registre à vos codes) comme cjheath l'a déjà souligné. Cependant j'ai aussi trouvé que les mesures supplémentaires à faire sur la vérification de la navigation dans l'url pour télécharger le contenu pour éviter que ces dialogues ouvrir/enregistrer. Mais je ne sais pas comment traiter avec le streaming de fichiers depuis je ne peut pas les ignorer, en regardant l'url à lui seul et à la fin, je me suis tourné vers l'Indy bibliothèque me sauver de tous les maux à traiter avec IE. Enfin, je me souviens de Microsoft fait parler de quelque chose en ligne que IE n'est pas conçu pour être utilisé comme un contrôle OLE. Selon ma propre expérience, à chaque fois que le contrôle accède à une nouvelle page a fait introduire des fuites de mémoire pour les programmes de!
J'ai eu de gros problèmes avec cette: chargement d'une page web qui est destiné à l'impression et il affiche fenêtres de dialogue Imprimer. Le InjectBlocker était la seule façon qui ont travaillé, mais assez peu fiable. Sous certaines conditions (je pense que c'est dû au fait que le contrôle WebBrowser utilise IE moteur et cela dépend installé la version de IE) la boîte de dialogue imprimer s'affiche toujours. C'est un problème majeur, la solution fonctionne sur Win7 avec IE9 installé, mais WinXP avec IE8 affiche la boîte de dialogue, peu importe quoi.
Je crois que la solution est de modifier le code source et la suppression de l'impression javascript, avant que la commande affiche la page. Cependant j'ai essayé avec: DocumentText propriété du contrôle webbrowser et il ne fonctionne pas. La propriété n'est pas en lecture seule, mais il n'a pas d'effet, quand je modifie le source.
La solution que j'ai trouvé pour mon problème est le Exec script:
J'ai réussi à injecter le code ci-dessus par la création d'une extension de
WebBroswer
classe et en remplaçant laOnNavigated
méthode.Cela semblait fonctionner assez bien:
Simplement à partir de l'explorateur de propriétés de contrôle: scriptErrorSupressed=true
La façon la plus simple de le faire est :
Dans l' : Contrôle Webbrowser vous avez la procédure ( standard )
BeforeScriptExecute
( Le paramètre de
BeforeScriptExecute
estpdispwindow
)Ajouter ceci :
De cette façon avant toute exécution de script sur la page de la fenêtre d'alerte sera supprimé par le code injecté.