MSHTML: Вызов члена объекта JavaScript? - PullRequest
0 голосов
/ 14 февраля 2012

Используя элемент управления .NET WebBrowser, довольно просто выполнить элемент HtmlElement.

Предполагается, что существует объект JavaScript с именем "player" с элементом с именем "getLastSongPlayed";вызов этого из элемента управления .NET WebBrowser будет выглядеть примерно так:

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

Теперь мой вопрос: как мне добиться этого с помощью mshtml?

Заранее спасибо, Алдин

РЕДАКТИРОВАТЬ:

Я получил его и работает, см. Мой ответ ниже!

1 Ответ

5 голосов
/ 16 февраля 2012

НАКОНЕЦ!Я получил его и запустил!

Причина выброса

System.InvalidCastException

всякий раз, когда я пытался ссылаться на parentWindow в mshtml.IHTMLDocument2 и / или назначать его в mshtml.IHTMLWindow2 оконный объект был связан с Threading.

По какой-то неизвестной мне причине кажется, что COM-объекты mshtml.IHTMLWindow работают в другом потоке, который должен быть однопотоковым (STA).state.

Итак, хитрость была в том, чтобы вызвать / выполнить требуемый фрагмент кода в другом потоке с состоянием 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.
    }
}

We 'Теперь он также может ссылаться на parentWindow объекта mshtml.IHTMLDocument2 и выполнять скрипт сайтов и / или наш собственный (помните, что он должен быть в потоке STA):

mshtml.IHTMLWindow2 window = doc.parentWindow;

window.execScript("AScriptFunctionOrOurOwnScriptCode();", "javascript");

Это может спасти кого-то от головной болив будущем.лол

...