我正试图在一些后台线程中使用一堆webbrowsers。当我使用我在设计视图中放置在窗体上的webbrowser控件但现在在运行时创建它们时,这没有问题。
我全局声明了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但这不起作用(在主线程上运行时,我的代码中的其他地方也不起作用)谢谢!
答案 0 :(得分:1)
Control.InvokeRequired和Invoke成员使用Handle属性来确定哪个线程拥有该控件。问题是,对于您创建的Web浏览器,句柄为空。当控件在窗体上可见时,控件只有一个有效的句柄。你没做的。然后它将尝试创建句柄,但这是一个失败的鲸鱼,像WebBrowser这样的ActiveX控件需要一个有效的Parent。没有Me.Control.Add(),就像你原来的版本一样,它没有。
解决方法很简单,您只需要另一个具有有效Handle属性的控件。任何人都会这样做,它只关心拥有句柄的线程,而不是句柄的值。
你有一个:你的表格。请改用Me.InvokeRequired
和Me.Invoke()
。或者Application.OpenForms(0)如果你不能轻易获得对表单对象的引用,最好避免使用。