2013-03-07 28 views
2

我正在使用axWebBrowser,並且需要製作一個腳本工作,它在列表框的選定項目發生更改時工作。如何在MSHTML中調用腳本工作

在默認webBrowser控件有一種方法,如;

WebBrowserEx1.Document.InvokeScript("script") 

但是在axWebBrowser中,我無法使用任何腳本!並沒有關於此控件的文檔。

任何人都知道如何?

回答

3

遲到的答案,但希望仍然可以幫助某人。使用WebBrowser 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); 
} 

必須有對JavaScript的eval至少一個<script>標籤的工作,它可以如上所示注射。

或者,JavaScript引擎可以異步初始化,如webBrowser.Document.InvokeScript("setTimer", new[] { "window.external.notifyScript()", "1" })webBrowser.Navigate("javascript:(window.external.notifyScript(), void(0))")

相關問題