views:

4714

answers:

7

I have a .NET 2.0 WebBrowser control used to navigate some pages with no user interaction (don't ask...long story). Because of the user-less nature of this application, I have set the WebBrowser control's ScriptErrorsSuppressed property to true, which the documentation included with VS 2005 states will [...]"hide all its dialog boxes that originate from the underlying ActiveX control, not just script errors." The MSDN article doesn't mention this, however. I have managed to cancel the NewWindow event, which prevents popups, so that's taken care of.

Anyone have any experience using one of these and successfully blocking all dialogs, script errors, etc?

EDIT

This isn't a standalone instance of IE, but an instance of a WebBrowser control living on a Windows Form application. Anyone have any experience with this control, or the underlying one, AxSHDocVW?

EDIT again

Sorry I forgot to mention this... I'm trying to block a JavaScript alert(), with just an OK button. Maybe I can cast into an IHTMLDocument2 object and access the scripts that way, I've used MSHTML a little bit, anyone know?

A: 

Are you able to edit the settings of the web browser. If so in IE under tools->internet options->advanced, you can disable script debugging and disable the phishing message. These will get rid of the script errors. Otherwise if you consider using firefox there is a no script plugin that does not allow anything to run apart from websites that you have allowed.

no script plugin

cjheath
No, this isn't a standalone instance of IE, it's a control that's hosted in a Windows Forms application.
Adam Neal
A: 

Are you trying to implement a web robot? I have little experience in using the hosted IE control but I did completed a few Win32 projects tried to use the IE control. Disabling the popups should be done via the event handlers of the control as you already did, but I found that you also need to change the 'Disable script debugging xxxx' in the IE options (or you could modify the registry in your codes) as cjheath already pointed out. However I also found that extra steps needed to be done on checking the navigating url for any downloadable contents to prevent those open/save dialogs. But I do not know how to deal with streaming files since I cannot skip them by looking at the urls alone and in the end I turned to the Indy library saving me all the troubles in dealing with IE. Finally, I remember Microsoft did mention something online that IE is not designed to be used as an OLE control. According to my own experience, every time the control navigates to a new page did introduce memory leaks for the programs!

William
+2  A: 

This is most definitely hacky, but if you do any work with the WebBrowser control, you'll find yourself doing a lot of hacky stuff.

This is the easiest way that I know of to do this. You need to inject JavaScript to override the alert function... something along the lines of injecting this JavaScript function:

window.alert = function () { }

There are many ways to do this, but it is very possible to do. One possibility is to hook an implementation of the DWebBrowserEvents2 interface. Once this is done, you can then plug into the NavigateComplete, the DownloadComplete, or the DocumentComplete (or, as we do, some variation thereof) and then call an InjectJavaScript method that you've implemented that performs this overriding of the window.alert method.

Like I said, hacky, but it works :)

I can go into more details if I need to.

David Mohundro
+1  A: 

You may have to customize some things, take a look at IDocHostUIHandler, and then check out some of the other related interfaces. You can have a fair amount of control, even to the point of customizing dialog display/ui (I can't recall which interface does this). I'm pretty sure you can do what you want, but it does require mucking around in the internals of MSHTML and being able to implement the various COM interfaces.

Some other ideas: http://msdn.microsoft.com/en-us/library/aa770041.aspx

IHostDialogHelper IDocHostShowUI

These may be the things you're looking at implementing.

Jim Crafton
+4  A: 

And for an easy way to inject that magic line of javascript, read how to inject javascript into webbrowser control.

Or just use this complete code:

private void InjectAlertBlocker() {
    HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
    HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
    string alertBlocker = "window.alert = function () { }";
    element.text = alertBlocker;
    head.AppendChild(scriptEl);
}
Sire
+1  A: 

I just published an article on Code Project that may help you.

Please see - http://www.codeproject.com/KB/shell/WebBrowserControlDialogs.aspx

Hope this helps.

This is great stuff, well done.
dr. evil
A: 

I managed to inject the code above by creating an extended WebBroswer class and overriding the OnNavigated method. This seemd to work quite well

class WebBrowserEx : WebBrowser { public WebBrowserEx () { }

protected override void OnNavigated( WebBrowserNavigatedEventArgs e ) { HtmlElement he = this.Document.GetElementsByTagName( "head" )[0]; HtmlElement se = this.Document.CreateElement( "script" ); mshtml.IHTMLScriptElement element = (mshtml.IHTMLScriptElement)se.DomElement; string alertBlocker = "window.alert = function () { }"; element.text = alertBlocker; he.AppendChild( se ); base.OnNavigated( e ); } }