我正在尝试在一些后台线程中使用一堆网络浏览器。当我使用在设计视图中放置在表单上但现在在运行时创建的Web浏览器控件时,这没有问题。
我在全局声明webbrowsers数组:
Dim webbroswers(-1) As WebBrowser
以下代码位于主线程上:
ReDim Preserve webbroswers(somenum)
For i = 0 To sumnum
webbroswers(currentbrowsermax + i) = New WebBrowser
Next
然后,此代码在后台线程上运行:
If webbroswers(num).InvokeRequired Then
webbroswers(num).Invoke(Sub() webbroswers(num).Navigate(someurl))
Else
webbroswers(num).Invoke(Sub() webbroswers(num).Navigate(someurl))
程序此时由于以下错误而崩溃:
无法获取“ WebBrowser”控件的窗口句柄。不支持无窗口ActiveX控件。
在这方面的任何帮助将是巨大的。另外,如果有人知道如何抑制脚本错误,那么我认为这可能会有所帮助。我试过了:WebBrowser(num).ScriptErrorsSuppressed = True,但这不起作用(在主线程上运行时,在我代码的其他地方也不起作用)谢谢!
Control.InvokeRequired和Invoke成员使用Handle属性确定拥有该控件的线程。问题是,对于您创建的Web浏览器,“句柄”为空。控件只有在窗体上可见时才具有有效的句柄。你没有做。然后它将尝试创建句柄,但这是一条失败的鲸鱼,像WebBrowser这样的ActiveX控件需要一个有效的Parent。如果没有Me.Control.Add(),就像您在原始版本中所做的那样,它将没有一个。
解决方法很简单,您只需要另一个具有有效Handle属性的控件即可。任何人都会这样做,它只关心拥有该句柄的线程,而不关心该句柄的值。
您有一个:您的表格。使用Me.InvokeRequired
和Me.Invoke()
代替。或Application.OpenForms(0)(如果您无法轻松获取对表单对象的引用),则最好避免。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句