MSHTML:正在调用javascript对象的成员

本文关键字:对象 成员 javascript 调用 MSHTML | 更新日期: 2023-09-27 18:24:38

使用.NET WebBrowser控件,执行HtmlElement的成员非常简单。

假设有一个名为"player"的JavaScript对象,其成员名为"getLastSongPlayed";从.NET WebBrowser控件调用它会变成这样:

HtmlElement elem = webBrowser1.Document.getElementById("player");
elem.InvokeMember("getLastSongPlayed");

现在我的问题是:如何使用mshtml实现这一点?

提前感谢,阿尔丁

编辑:

我启动并运行了它,请参阅下面的答案!

MSHTML:正在调用javascript对象的成员

终于!!我把它启动并运行!

的原因

System.InvalidCastException

每当我试图引用mshtml的parentWindow时,就会抛出。IHTMLDocument2和/或将其分配给mshtml。IHTMLWindow2窗口对象与线程有关。

对于一些我不知道的人来说,原因似乎是mshtml的COM对象。IHTMLWindow正在另一个线程上操作,该线程必须处于单线程单元(STA)状态。

因此,诀窍是在另一个STA状态的线程上调用/执行所需的代码。

这是一个示例代码:

SHDocVw.InternetExplorer IE = new SHDocVw.InternetExplorer
bool _isRunning = false;
private void IE_DocumentComplete(object pDisp, ref obj URL)
{
    //Prevent multiple Thread creations because the DocumentComplete event fires for each frame in an HTML-Document
    if (_isRunning) { return; }
    _isRunning = true;
    Thread t = new Thread(new ThreadStart(Do))
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
}
private void Do()
{
    mshtml.IHTMLDocument3 doc = this.IE.Document;
    mshtml.IHTMLElement player = doc.getElementById("player");
    if (player != null)
    {
        //Now we're able to call the objects properties, function (members)
        object value = player.GetType().InvokeMember("getLastSongPlayed", System.Reflection.BindingFlags.InvokeMethod, null, player, null);
        //Do something with the returned value in the "value" object above.
    }
}

我们现在还可以引用mshtml的parentWindow。IHTMLDocument2对象并执行站点脚本和/或我们自己的脚本(记住它必须在STA线程上):

mshtml.IHTMLWindow2 window = doc.parentWindow;
window.execScript("AScriptFunctionOrOurOwnScriptCode();", "javascript");

这可能会让人们在未来免于头疼。lol

相关文章: