嘿,我试图从表格的其余部分创建一个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页上的控件但不会创建.有任何想法吗?谢谢补充说
您违反了多个线程规则:
你无法按照预期的那样工作,Web浏览器根本不是可以处理多个线程的代码块.即使您在正确的线程上创建它,在后台线程上进行的调用也将由COM封送以实现STA合同,没有并发性.
在一个泵浦消息循环(Application.Run)的单独STA线程上使用它很好但是必须在同一个线程上创建表单及其控件.
| 归档时间: |
|
| 查看次数: |
2691 次 |
| 最近记录: |