Как вызвать скрипты, работающие в msHTML

Я использую axWebBrowser, и мне нужно заставить работать скрипт, который работает при изменении выбранного элемента списка.

В элементе управления webBrowser по умолчанию есть такой метод, как;

WebBrowserEx1.Document.InvokeScript("script")

Но в axWebBrowser не могу работать ни один скрипт! И нет никакой документации об этом контроле.

Кто-нибудь знает как?


person Mtok    schedule 07.03.2013    source источник


Ответы (1)


Поздний ответ, но, надеюсь, все же может кому-то помочь. Существует несколько способов вызова сценария при использовании элемента управления ActiveX веб-браузера. Те же методы можно использовать с WinForms-версией элемента управления WebBrowser (через webBrowser.HtmlDocument.DomDocument) и с версией WPF (через webBrowser.Document):

void CallScript(SHDocVw.WebBrowser axWebBrowser)
{
    //
    // Using C# dynamics, which maps to COM's IDispatch::GetIDsOfNames, 
    // IDispatch::Invoke
    //

    dynamic htmlDocument = axWebBrowser.Document;
    dynamic htmlWindow = htmlDocument.parentWindow;
    // make sure the web page has at least one <script> tag for eval to work
    htmlDocument.body.appendChild(htmlDocument.createElement("script"));

    // can call any DOM window method
    htmlWindow.alert("hello from web page!");

    // call a global JavaScript function, e.g.:
    // <script>function TestFunc(arg) { alert(arg); }</script>
    htmlWindow.TestFunc("Hello again!");

    // call any JavaScript via "eval"
    var result = (bool)htmlWindow.eval("(function() { return confirm('Continue?'); })()");
    MessageBox.Show(result.ToString());

    //
    // Using .NET reflection:
    //

    object htmlWindowObject = GetProperty(axWebBrowser.Document, "parentWindow");

    // call a global JavaScript function
    InvokeScript(htmlWindowObject, "TestFunc", "Hello again!");

    // call any JavaScript via "eval"
    result = (bool)InvokeScript(htmlWindowObject, "eval", "(function() { return confirm('Continue?'); })()");
    MessageBox.Show(result.ToString());
}

static object GetProperty(object callee, string property)
{
    return callee.GetType().InvokeMember(property,
        BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.Public,
        null, callee, new Object[] { });
}

static object InvokeScript(object callee, string method, params object[] args)
{
    return callee.GetType().InvokeMember(method,
        BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
        null, callee, args);
}

Для работы eval в JavaScript должен быть хотя бы один тег <script>, который можно внедрить, как показано выше.

Кроме того, движок JavaScript может быть инициализирован асинхронно с чем-то вроде webBrowser.Document.InvokeScript("setTimer", new[] { "window.external.notifyScript()", "1" }) или webBrowser.Navigate("javascript:(window.external.notifyScript(), void(0))").

person noseratio    schedule 25.09.2013