调用webbrowser到第二个标签页visual c#

时间:2010-01-13 21:52:23

标签: c# browser

嘿,我正在尝试从表单的其余部分创建一个sperate线程上的两个webbrowsers。一个转到tabpage1,另一个转到tabpage2。第一个浏览器创建精细到page1但第二个浏览器不会添加和错误“无法获取'WebBrowser'控件的窗口句柄。不支持无窗口ActiveX控件。”发生。继承我的代码:

private Thread t;  
WebBrowser webBrowser1, webBrowser2;  
public delegate void Addc1(Control o);  
public delegate void Addc2(Control o);  
public Addc1 AddControl1;  
public Addc2 AddControl2;  
public Form1()  
{  
        InitializeComponent();  
        AddControl1 = new Addc1(AddTabControl1);  
        AddControl2 = new Addc2(AddTabControl2);         
}        
private void button2_Click(object sender, EventArgs e)  
{  
        t = new Thread(new ThreadStart(this.UIStart));  
        t.SetApartmentState(ApartmentState.STA);  
        t.Start();  
}  
public void UIStart()  
{  
            WebBrowser webBrowser1 = new WebBrowser();  
            webBrowser1.Location = new System.Drawing.Point(1,1);  
            webBrowser1.Size = new System.Drawing.Size(936, 35);  
            webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser2_DocumentCompleted);  
            tabPage1.Invoke(AddControl1, new Object[] { webBrowser1 });  

            WebBrowser webBrowser2 = new WebBrowser();  
            webBrowser2.Location = new System.Drawing.Point(1,1);  
            webBrowser2.Size = new System.Drawing.Size(936, 935);  
            webBrowser2.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser2_DocumentCompleted);    
            tabPage2.Invoke(AddControl2, new Object[] { wedBrowser2 });  


            webBrowser1.Navigate("www.ask.com");  
            webBrowser2.Navigate("www.google.com");  
        }  
        public void AddTabControl1(Control o)  
        {  
            tabPage1.Controls.Add(o);  
        }  
        public void AddTabControl2(Control o)  
        {  
            tabPage2.Controls.Add(o);  
        }  
}  

正如我所说,webbrowser1将创建并导航,但另一个将添加到第2页的控件但不会创建。有任何想法吗? 谢谢补充

1 个答案:

答案 0 :(得分:5)

您违反了多个线程规则:

  • WebBrowser是一个具有单线程单元要求的ActiveX控件。您正在将线程正确设置为STA但是您违反了第二个要求:STA线程必须泵送消息循环。你还没到那么远,但DocumentCompleted事件永远不会发生。
  • Windows要求子控件与其父控件属于同一个线程。在你的情况下,有一个令人讨厌的不匹配。由于Controls.Add()调用,AxHost包装器将在UI线程上创建,但WebBrowser使用的本机窗口句柄可能不会。我认为这是您获得的例外的来源。

您无法按预期工作,Web浏览器根本不是可以处理多个线程的代码块。即使您在正确的线程上创建它,在后台线程上进行的调用也将由COM封送以实现STA合同,没有并发性。

在一个泵送消息循环(Application.Run)的单独STA线程上使用它很好但是必须在同一个线程上创建表单及其控件。