C# 弹出窗口浏览器控件

C# 弹出窗口浏览器控件,c#,winforms,webbrowser-control,C#,Winforms,Webbrowser Control,我正在使用webbrowser控件从网站获取一些信息。它有一个详细信息链接,单击该链接会打开一个弹出窗口,并在webbrowser中显示详细信息 如果单击webbrowser控件中的链接(按程序)打开另一个窗口并显示执行错误,如何执行这些操作 但在explorer中,它正在工作。我注意到,只有当我在Internet Explorer中打开主页时,详细链接才起作用,否则,如果我直接从Internet Explorer调用详细URL,它也会给我同样的错误。我最近遇到了一个非常类似的情况。在我的例子中

我正在使用webbrowser控件从网站获取一些信息。它有一个详细信息链接,单击该链接会打开一个弹出窗口,并在webbrowser中显示详细信息

如果单击webbrowser控件中的链接(按程序)打开另一个窗口并显示执行错误,如何执行这些操作


但在explorer中,它正在工作。我注意到,只有当我在Internet Explorer中打开主页时,详细链接才起作用,否则,如果我直接从Internet Explorer调用详细URL,它也会给我同样的错误。

我最近遇到了一个非常类似的情况。在我的例子中,弹出式浏览器没有共享嵌入式浏览器的会话。我要做的是捕获NewWindow事件并取消它,然后将预期的URL发送到嵌入式浏览器。我需要使用ActiveX浏览器实例,因为它提供了试图启动的URL。这是我的密码:

您需要将Microsoft Internet控件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);
    }
}

提炼为答案

  • 添加COM引用Microsoft Internet控件
  • 使用Middas代码
  • 在表单加载中定义Uri,所有弹出窗口将直接更改winform WebBrowser

    • 这是动态版本。它不需要静态绑定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
          }
      }
      

      你的意思是该链接在webbrowser控件中不起作用,但在IE中起作用?是的,它在webbrowser控件中不起作用嗯,有人可以为windows 8制作此链接吗?如果要关闭弹出窗口并返回到原来的位置,你该怎么办?这似乎是一个非常容易实现的方法,但我认为回到主屏幕需要做更多的工作。您必须为此实现一个自定义解决方案。像自己存储浏览器历史记录和向后导航这样简单的方法会奏效,尽管它没有其他解决方案那么优雅。是的,我想。我将要做的是捕获新窗口,并旋转一个新的WebBrowser控件和窗口以强制它进入。我以前使用过这个,它工作正常。然而,我现在正试图为一个不同的网站这样做,但它不起作用。即使“axBrowser”对象有效,事件也不会触发。知道为什么会这样吗?