【问题标题】:Popup window webbrowser control弹出窗口浏览器控件
【发布时间】:2013-02-20 19:22:12
【问题描述】:

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

如果单击 webbrowser 控件中的链接(按程序)打开另一个窗口并显示执行错误,我该怎么做。

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

【问题讨论】:

  • 您的意思是链接在浏览器控件中无效,但在 IE 中有效?
  • 是的,它在 webbrowser 控件中不起作用
  • 嗯,有人可以为 Windows 8 制作这个吗?

标签: c# winforms webbrowser-control


【解决方案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
    }
}

【讨论】:

    【解决方案2】:

    细化为 Middas 的答案...

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

    【讨论】:

      【解决方案3】:

      我最近遇到了一个非常相似的情况。就我而言,弹出式浏览器没有共享嵌入式浏览器的会话。我必须做的是捕获 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);
          }
      }
      

      【讨论】:

      • 如果您想关闭弹出窗口并返回到原来的位置,您会怎么做?这似乎是一种非常容易实现的方法,但我认为返回主屏幕需要更多的工作..
      • 您必须为此实施自定义解决方案。像自己存储浏览器历史记录并向后导航这样简单的事情会起作用,尽管它不像其他解决方案那样优雅。
      • 是的,我想。我要做的是捕获 NewWindow 并启动一个新的 WebBrowser 控件和窗口以强制它进入。
      • 我以前用过这个,它有效。但是,我现在正在尝试为不同的网站执行此操作,但它不起作用。即使“axBrowser”对象有效,该事件也不会触发。知道为什么会发生这种情况吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2011-12-08
      • 2019-02-21
      相关资源
      最近更新 更多