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

use*_*037 2 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);  
        }  
}  
Run Code Online (Sandbox Code Playgroud)

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

Han*_*ant 5

您违反了多个线程规则:

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

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

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