如何在我创建的另一个窗口中显示来自WebBrowser的弹出窗口?

Stu*_*art 7 c# mdiparent webbrowser-control

我试图在我的一个应用程序中实现一个简单的Web浏览器控件.这是为了帮助将Web应用程序集成到我正在创建的工具集中.

问题是,这个网络应用程序绝对喜欢弹出窗口....

当弹出窗口打开时,它会在IE窗口中打开,该窗口不是我的主窗口所属的MDI容器窗体的子窗口.

如何通过单击我的WebBrowser中的链接创建任何和所有弹出窗口作为我的MDI容器的子项(类似于设置窗体的MDIParent属性)?

提前致谢.

Han*_*ant 25

Web浏览器控件支持NewWindow事件以获得有关弹出窗口的通知.但是,Winforms包装器不会让你做很多事情,你只能取消弹出窗口.本机COM包装器允许传回Web浏览器的新实例,然后该实例将用于显示弹出窗口.

利用这一点需要一些工作.对于初学者,使用Project + Add Reference,Browse选项卡并选择c:\ windows\system32\shdocvw.dll.这增加了对本机COM接口的引用.

创建一个充当弹出窗体的表单.删除WebBrowser并使其代码看起来类似于:

public partial class Form2 : Form {
    public Form2() {
        InitializeComponent();
    }
    public WebBrowser Browser {
        get { return webBrowser1; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Browser属性提供对将用于在弹出窗口中显示网页的浏览器的访问.

现在回到主要表格.删除WebBrowser并使其代码如下所示:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        webBrowser1.Url = new Uri("http://google.com");
    }
    SHDocVw.WebBrowser nativeBrowser;
    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);
        nativeBrowser = (SHDocVw.WebBrowser)webBrowser1.ActiveXInstance;
        nativeBrowser.NewWindow2 += nativeBrowser_NewWindow2;
    }
    protected override void OnFormClosing(FormClosingEventArgs e) {
        nativeBrowser.NewWindow2 -= nativeBrowser_NewWindow2;
        base.OnFormClosing(e);
    }

    void nativeBrowser_NewWindow2(ref object ppDisp, ref bool Cancel) {
        var popup = new Form2();
        popup.Show(this);
        ppDisp = popup.Browser.ActiveXInstance;
    }
}
Run Code Online (Sandbox Code Playgroud)

OnLoad方法获取对本机COM接口的引用,然后将事件处理程序订阅到NewWindow2事件.我确保在FormClosing事件处理程序中取消订阅该事件,而不是100%确定是否有必要.更安全然后抱歉.

NewWindow2事件处理程序是关键,请注意第一个参数允许传回一个无类型的引用.那应该是弹出窗口中的本机浏览器.所以我创建了一个Form2实例和Show()它.注意Show()的参数,它确保弹出窗口是一个拥有的窗口.根据您的应用需要替换它,我假设您想在您的情况下创建一个MDI子窗口.

请注意,当Javascript使用alert()时,此事件不会触发显示的窗口.浏览器不会将该窗口视为HTML弹出窗口,也不会使用浏览器窗口显示它,因此您无法拦截或替换它.

  • @rima - 在Windows 8上使用IE10和VS2012重新测试.仍然很好.单击"提问"按钮而不是"投票"按钮. (3认同)