在我的主窗口(Form1
)上有一个WebBrowser元素导航到某些目标。 (大部分时间都是从Threads调用的)
现在我需要从一个Thread中获取该WebBrowser的DocumentText
。尝试这样做会导致异常:
发生了类型为“System.InvalidCastException”的未处理异常 在System.Windows.Forms.dll
中
异常出现在以下行中(在线程内):
String newContent = webBrowser1.DocumentText.ToString();
以相同的方式从主线程中访问DocumentText。
我无法在Thread内部创建WebBrowser元素,因为我需要停用各种脚本元素,然后我收到Excception:
"Window handle of control element "AxTriggerCtrl" could not read.
"Windowless ActiveX-controls are not supported"
我想使用WebBrowser而不是WebClient,因为它需要遵循各种(javascript)重定向,元刷新和Ajax加载的内容。
我可能可以创建一个包含Webbrowser的Form2,从线程调用它并使用它 - 但我希望还有另一个解决方案:)
有什么想法吗?
public delegate String GetWebBrowserTextThread();
public String GetWebBrowserText()
{
if (webBrowser1.InvokeRequired)
{
GetWebBrowserTextThread gwbtt = new GetWebBrowserTextThread(GetWebBrowserText);
return (String)webBrowser1.Invoke(gwbtt);
}
else
{
return webBrowser1.DocumentText;
}
}
并从主题:
String newContent = cfg.ApplicationForm1.GetWebBrowserText(); //cfg is just a configuration singleton
在问之前应该尝试过 - 会节省一些时间和头痛:)
答案 0 :(得分:1)
如果您使用的是桌面应用程序,请使用任何控件的Invoke函数在UI线程中执行一段代码,否则如果您使用的是WPF,则可以使用Dispatcher.Invoke执行相同操作。