从后台线程vb.net操作运行时Webbrowser控件

FraserOfSmeg

我正在尝试在一些后台线程中使用一堆网络浏览器。当我使用在设计视图中放置在表单上但现在在运行时创建的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.InvokeRequiredMe.Invoke()代替。或Application.OpenForms(0)(如果您无法轻松获取对表单对象的引用),则最好避免。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在运行时VB.NET获取多个已创建控件的值

来自分类Dev

如何在vb.net Windows窗体中在运行时更改TableLayoutPanel控件中控件的位置

来自分类Dev

应用程序运行时的后台操作

来自分类Dev

iOS使线程在后台运行

来自分类Dev

C#后台线程在UserControl中运行时出现错误

来自分类Dev

vb.net运行时按钮和“ AddressOf”括号

来自分类Dev

C#-在创建新控件的线程仍在运行时关闭表单

来自分类Dev

对多个控件的线程安全调用vb net

来自分类Dev

如何从后台线程访问WPF控件

来自分类Dev

在阻止后台线程的同时在后台线程的主线程中运行代码

来自分类Dev

在阻止后台线程的同时在后台线程的主线程中运行代码

来自分类Dev

UI线程与后台线程-UI控件可访问性边界

来自分类Dev

在后台线程上运行“异步”方法

来自分类Dev

在后台线程中启动可运行

来自分类Dev

Grails-在后台运行TCP线程

来自分类Dev

强制SKPaymentQueue在后台线程上运行

来自分类Dev

如何在Ruby中运行后台线程?

来自分类Dev

在C ++ 11中在后台运行线程

来自分类Dev

线程似乎不在后台运行

来自分类Dev

在后台线程iOS上运行Pusher

来自分类Dev

强制SKPaymentQueue在后台线程上运行

来自分类Dev

如何取消后台运行的线程?(iOS)

来自分类Dev

为什么后台线程执行时主线程挂起

来自分类Dev

WPF-VB6互操作导致计时器运行时错误

来自分类Dev

VB.NET多线程无限线程

来自分类Dev

Go运行时使用的线程数

来自分类Dev

VB.net停止后台工作

来自分类Dev

未知的运行时错误VB

来自分类Dev

VB.NET在运行时确定项目的导入名称空间