首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >指定的强制转换无效--在不同的UI线程中访问WebBrowser

指定的强制转换无效--在不同的UI线程中访问WebBrowser
EN

Stack Overflow用户
提问于 2013-07-29 16:04:42
回答 3查看 1.6K关注 0票数 0

我很困惑我的程序是如何工作的。我使用线程(从另一个堆栈溢出响应中被告知这样做),以便webBrowser2.Navigate(Url); in TestScenarios()GetScenarios()while循环中异步运行。这一切都很好。

现在,我在WebBrowser控件中添加了一段代码来注入和运行一些javascript。然而,每次我打电话给HtmlElement head = webBrowser2.Document..。行中,我得到了“指定的强制转换无效错误”。

我知道这个错误与在一个单独的UI线程中访问WebBrowser控件有关,并且无法以这种方式工作,但我不知道这到底意味着什么,以及如何修复它。

如果您需要更多的上下文,只需评论。

代码语言:javascript
运行
复制
public void GetScenarios()
    {
        new Thread(() =>
        {
            while() {
            ...
            TestScenarios();
            }
        }).Start();
    }

    TestScenarios() {
        ...
        Action action = () =>
                {
                    webBrowser2.Tag = signal;
                    webBrowser2.Navigate(Url);
                    webBrowser2.DocumentCompleted -= WebBrowserDocumentCompleted;
                    webBrowser2.DocumentCompleted += WebBrowserDocumentCompleted;
                };
                webBrowser2.Invoke(action);
                signal.WaitOne();
        ...
        //Run some javascript on the WebBrowser control
        HtmlElement head = webBrowser2.Document.GetElementsByTagName("head")[0];
                    HtmlElement scriptEl = webBrowser2.Document.CreateElement("script");
                    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
                    element.text = "function sayHello() { alert('hello') }";
                    head.AppendChild(scriptEl);
                    webBrowser2.Document.InvokeScript("sayHello");
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-29 16:21:39

您正面临这个问题,因为在加载文档之前正在访问webBrowser的元素。你应该移动这段代码

代码语言:javascript
运行
复制
HtmlElement head = webBrowser2.Document.GetElementsByTagName("head")[0];
                    HtmlElement scriptEl = webBrowser2.Document.CreateElement("script");
                    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
                    element.text = "function sayHello() { alert('hello') }";
                    head.AppendChild(scriptEl);
                    webBrowser2.Document.InvokeScript("sayHello");

代码语言:javascript
运行
复制
WebBrowserDocumentCompleted

事件。

票数 2
EN

Stack Overflow用户

发布于 2013-07-29 16:15:13

首先..。你真的应该在调试器中完成它,找出你要转换的对象是什么.这看起来不像是一个线程问题。

根据您的错误,webBrowser2.Document.GetElementsByTagName("head")[0]不能转换为HtmlElement

你也可以试试这样的方法看看物体是什么.

代码语言:javascript
运行
复制
var head = webBrowser2.Document.GetElementsByTagName("head")[0] as HtmlElement;
if (head == null)
{
    Console.WriteLine(typeof(head);  // output the object type somehow
}
票数 1
EN

Stack Overflow用户

发布于 2013-07-29 16:18:44

通过将JS脚本块封装到:

代码语言:javascript
运行
复制
webBrowser2.Invoke(new Action(() =>
{
     //......
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17928767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档