Blockieren von Dialogen in .NET WebBrowser-Steuerelement
Habe ich eine .NET 2.0 WebBrowser-Steuerelement verwendet, um zu navigieren, einige Seiten mit keine Benutzer-Interaktion (Fragen Sie nicht...lange Geschichte). Da der Benutzer weniger die Natur dieser Anwendung, ich habe das WebBrowser-Steuerelement ScriptErrorsSuppressed-Eigenschaft auf true, die die Dokumentation, die mit VS 2005-Staaten werden [...]"hide all seinen Dialogboxen, die Ihren Ursprung aus dem zugrunde liegenden ActiveX-Steuerelement, nicht nur script-Fehler." Die MSDN-Artikel nicht erwähnt, jedoch.
Ich habe es geschafft, zu kündigen, das NewWindow-Ereignis, das verhindert, dass popups, das ist also gesorgt.
Jemand irgendwelche Erfahrung mit einem dieser und erfolgreich blockieren alle Dialoge, Skript-Fehler, etc?
BEARBEITEN
Dies ist nicht eine eigenständige Instanz des IE, sondern eine Instanz des WebBrowser-Steuerelement an ein Leben auf einem Windows-Form-Anwendung. Wer noch keine Erfahrung mit dieser Steuerung, oder die zugrunde liegenden, AxSHDocVW?
BEARBEITEN wieder
Sorry, ich vergaß das zu erwähnen... ich versuche zu blockieren, JavaScript alert()mit nur einem OK-button. Vielleicht kann ich warf in einem IHTMLDocument2-Objekt und den Zugriff auf die Skripts, die Art und Weise, die ich verwendet habe, MSHTML ein bisschen, wer weiß?
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist definitiv hacky, aber wenn Sie tun, jede Arbeit mit dem WebBrowser-Steuerelement, Sie finden sich dabei eine Menge von hacky Zeug.
Dies ist der einfachste Weg, die ich kenne, dies zu tun. Sie injizieren müssen JavaScript überschreiben Sie die alert-Funktion... etwas entlang der Linien der Injektion diese JavaScript-Funktion:
Gibt es viele Möglichkeiten, dies zu tunaber es ist durchaus möglich, zu tun. Eine Möglichkeit ist der Haken, eine Umsetzung der DWebBrowserEvents2 - Schnittstelle. Sobald dies erledigt ist, können Sie dann den Stecker in die NavigateComplete, das DownloadComplete, oder die DocumentComplete (oder, wie wir es tun, eine Variante davon) und rufen Sie dann ein InjectJavaScript Methode, die Sie implementiert haben, führt dieses zu überschreiben und die Fenster.die Methode alert.
Wie gesagt, hacky, aber es funktioniert 🙂
Kann ich mehr details, wenn ich muss.
InformationsquelleAutor der Antwort David Mohundro
Und für eine einfache Möglichkeit, um zu injizieren, die magic line von javascript, Lesen wie zu injizieren javascript-Code in webbrowser-Steuerelement.
Oder nutzen Sie einfach dieses komplette code:
InformationsquelleAutor der Antwort
Bulletproof alert-blocker:
In diesem Beispiel wird vorausgesetzt Sie haben Microsoft.mshtml Referenz Hinzugefügt, "mit mshtml;" in namespaces und Browser ist Ihre WebBrowser Instanz.
Warum kugelsicher? Erstens, es verarbeitet Skripte in frames. Dann, es nicht abstürztwenn eine spezielle "killer-frame" existiert im Dokument. Ein "killer-frame" ist ein Bild, das wirft eine Ausnahme auf den Versuch, es zu benutzen, wie HtmlWindow-Objekt. Keine "foreach" Dokumente.Fenster.Frames würde zu einer exception führen, also sicherer "for" - Schleife verwendet werden muss, mit try /catch-block.
Vielleicht ist es nicht die meisten lesbares Stück code, aber es funktioniert mit dem wirklichen Leben, schlecht ausgebildet-Seiten.
InformationsquelleAutor der Antwort
Können Sie anpassen, einige Dinge, werfen Sie einen Blick auf
IDocHostUIHandler
und dann überprüfen Sie heraus einige der anderen zugehörigen Schnittstellen. Sie können einen fairen Betrag von Steuern, sogar bis zu dem Punkt anpassen-dialog-display/ui (ich kann mich nicht erinnern, welche Schnittstelle dies tut). Ich bin mir ziemlich sicher, dass Sie tun können was Sie wollen, aber es erfordert ausmisten um in die Interna derMSHTML
und die Möglichkeit zur Umsetzung der verschiedenenCOM
Schnittstellen.Einige andere Ideen:
http://msdn.microsoft.com/en-us/library/aa770041.aspx
Diese können die Dinge, die Sie suchen bei der Umsetzung.
InformationsquelleAutor der Antwort Jim Crafton
Nur hinzufügen, dass zu Ihrem entry-level-Funktion. Nach viel Forschung ist, wenn stieß ich auf diese Methode, und berühren Holz, bis jetzt es geklappt hat. Prost!!
InformationsquelleAutor der Antwort
Ich habe gerade einen Artikel veröffentlicht, auf Code-Projekt, die Ihnen helfen können.
Finden - http://www.codeproject.com/KB/shell/WebBrowserControlDialogs.aspx
Hoffe, das hilft.
InformationsquelleAutor der Antwort
Fenster.showModelessDialog und Fenster.showModalDialog können blockiert werden, durch die Umsetzung INewWindowManager-Schnittstelle, zusätzlich code unten zeigen, wie block-alert-Dialogen durch die Umsetzung IDocHostShowUI
InformationsquelleAutor der Antwort
Den
InjectAlertBlocker
ist absolut richtigcode ist
Referenzen Hinzugefügt werden müssen, ist
Fügen Sie einen Verweis auf
MSHTML
die probalby als "Microsoft HTML Object Library" unterCOM
Referenzen.Hinzufügen
using mshtml;
zu Ihrer namespaces.Erhalten einen Verweis auf das script-element ist
IHTMLElement
:Dann können Sie die
Navigated
- Ereignis des webbrowser wie:InformationsquelleAutor der Antwort
Sind Sie versuchen, zu implementieren, ein web-Roboter? Ich habe wenig Erfahrung in der Verwendung der gehosteten IE Kontrolle, aber ich habe abgeschlossen, ein paar Win32-Projekten versucht, die IE-control. Deaktivieren des popups sollte getan werden, über die Ereignishandler des Steuerelements als Sie bereits haben, aber ich fand, dass müssen Sie auch ändern Sie die "Disable script-debugging-xxxx" in den IE-Optionen (oder Sie können die Registrierung ändern, Sie in Ihre codes) als cjheath bereits hingewiesen. Allerdings fand ich auch, dass zusätzliche Schritte getan werden musste, ist die überprüfung der Navigation url für einen Download-Inhalte zu verhindern, dass diejenigen, die öffnen - /speichern-Dialoge. Aber ich weiß nicht, wie man mit streaming-Dateien, da kann ich nicht überspringen, indem man die urls allein und am Ende wandte ich mich an die Indy-Bibliothek spart mir all die Probleme im Umgang mit IE. Schließlich, ich erinnere mich an Microsoft habe erwähnt, etwas online, dass der IE ist nicht entworfen, um als ein OLE-Steuerelement. Nach meiner eigenen Erfahrung, jedes mal, wenn die Kontrolle zu einer neuen Seite navigiert hat die Einführung Speicherverluste für die Programme!
InformationsquelleAutor der Antwort William
Ich hatte größere Probleme mit diesem: laden einer Webseite, die für den Druck bestimmt, und es zeigt lästige Drucken-dialog. Die InjectBlocker der einzige Weg war, das war aber ziemlich unzuverlässig. Unter bestimmten Bedingungen (ich bin denkend, dass es durch das WebBrowser-Steuerelement verwendet die IE-engine, und diese hängt davon ab, installierte IE-version) drucken-dialog noch angezeigt wird. Das ist ein großes problem, die Lösung funktioniert auf Win7 mit IE9 installiert, aber WinXP mit IE8 zeigt den dialog, egal was.
Ich glaube, die Lösung ist im Quellcode verändern und entfernen des print-javascript, bevor die Steuerung rendert die Seite. Allerdings habe ich versucht mit: DocumentText-Eigenschaft des webbrowser-Steuerelement, und es funktioniert nicht. Die Eigenschaft ist nicht schreibgeschützt, aber es hat keine Wirkung, wenn ich ändern Sie die Quelle.
Die Lösung, die ich gefunden für mein problem ist die Exec Skript:
InformationsquelleAutor der Antwort
Ich es geschafft, injizieren Sie den obigen code durch die Schaffung einer erweiterten
WebBroswer
- Klasse und überschreiben Sie dieOnNavigated
Methode.Dies schien ganz gut zu funktionieren:
InformationsquelleAutor der Antwort
Einfach aus der browser-Steuerelement-Eigenschaften: scriptErrorSupressed=true
InformationsquelleAutor der Antwort
Der einfachste Weg, dies zu tun ist :
In : Webbrowser-Steuerelements müssen Sie die Prozedur ( standard )
BeforeScriptExecute
( Die parameter für
BeforeScriptExecute
istpdispwindow
)Hinzufügen :
In dieser Weise vor jeder Skript-Ausführung auf der Seite Fenster Alarm wird unterdrückt durch eingefügten code.
InformationsquelleAutor der Antwort