0

我正在尝试在一些后台线程中使用一堆网络浏览器。当我使用在设计视图中放置在表单上但现在在运行时创建的 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 但这不起作用(在主线程上运行时它在我的代码的其他地方也不起作用)谢谢!

4

1 回答 1

1

Control.InvokeRequired 和 Invoke 成员使用 Handle 属性来确定哪个线程拥有该控件。问题是,您创建的 Web 浏览器的 Handle 为空。控件仅在您使其在窗体上可见时才具有有效句柄。你没有这样做。然后它将尝试创建句柄,但这是一个失败的鲸鱼,像 WebBrowser 这样的 ActiveX 控件需要一个有效的父级。没有 Me.Control.Add(),就像您在原始版本中所做的那样,它不会有一个。

解决方法很简单,您只需要另一个具有有效 Handle 属性的控件。任何都可以,它只关心拥有句柄的线程,而不关心句柄的值。

你有一个:你的表格。使用Me.InvokeRequiredandMe.Invoke()代替。或者 Application.OpenForms(0) 如果你不能轻易获得对表单对象的引用,最好避免。

于 2013-11-11T17:29:03.810 回答