弹出窗口Web浏览器控件

4
我正在使用WebBrowser控件从网站上获取一些信息。它有一个详细链接,当点击时,会打开一个弹出窗口并在WebBrowser中显示详细信息。
如何在程序中点击WebBrowser控件中的链接以打开另一个窗口并显示执行错误?
但是在浏览器中它可以正常工作。我注意到只有在Internet Explorer中打开主页面时详细链接才有效,否则如果直接从Internet Explorer调用详细URL,它也会给我同样的错误。

你的意思是在WebBrowser控件中链接无法工作,但在IE中可以工作? - Chibueze Opata
1
是的,在 WebBrowser 控件中它不起作用。 - eldhose varghese
有人能为Windows 8制作这个吗? - ave
3个回答

13
我最近遇到了一个非常类似的情况。在我的情况下,弹出式浏览器没有共享嵌入式浏览器的会话。我必须捕获 NewWindow 事件并取消它,然后将目标 URL 发送到嵌入式浏览器。我需要使用 ActiveX 浏览器实例,因为它可以给你试图启动的 URL。这是我的代码:
你需要添加 Microsoft Internet Controls COM 引用到你的项目中才能使它工作。
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        // this assumes that you've added an instance of WebBrowser and named it webBrowser to your form
        SHDocVw.WebBrowser_V1 axBrowser = (SHDocVw.WebBrowser_V1)webBrowser.ActiveXInstance;

        // listen for new windows
        axBrowser.NewWindow += axBrowser_NewWindow;
    }

    void axBrowser_NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
    {
        // cancel the PopUp event
        Processed = true;

        // send the popup URL to the WebBrowser control
        webBrowser.Navigate(URL);
    }
}

如果你想关闭弹出窗口并返回到之前的位置,该怎么办呢?这似乎是一个非常容易实现的方法,但我认为回到主屏幕需要更多的工作... - Josh Smeaton
你需要为此实施一个定制解决方案。像自己存储浏览器历史记录并向后导航这样简单的方法会起作用,尽管不如其他解决方案那么优雅。 - Middas
是的,我明白了。我要做的是捕获NewWindow并启动一个新的WebBrowser控件和窗口来强制执行它。 - Josh Smeaton
我以前用过这个,它有效。但是,我现在正在尝试使用它在另一个网站上,但却无法正常工作。即使“axBrowser”对象有效,事件也不会触发。有任何想法为什么会这样? - Starfleet Security

1
这是动态版本。它不需要静态绑定的COM互操作,这在未来的Windows版本中总是会出现问题。
    public partial class Form10 : Form
{
    public Form10()
    {
        InitializeComponent();
        webBrowser1.Navigate("about:blank");
        dynamic ax = this.webBrowser1.ActiveXInstance;
        ax.NewWindow += new NewWindowDelegate(this.OnNewWindow);
        this.webBrowser1.Navigate("http://google.com");
    }
    private delegate void NewWindowDelegate(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed);
    private void OnNewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
    {
        Processed = true;
        //your own logic
    }
}

0

参考Middas的答案...

  • 添加COM引用Microsoft Internet Controls。
  • 使用Middas的代码。
  • 在form_Load中定义您的Uri,所有弹出窗口都将直接更改您的Winform WebBrowser。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接