2011-07-05 4 views
3
using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

public static class Program 
{ 
    [STAThread] 
    public static void Main() 
    { 
     using (var browser = new WebBrowser()) 
     { 
      browser.Navigate(string.Empty); 

      browser.Document.InvokeScript("execScript", new object[] { "function set_obj(obj) { window.obj = obj }" }); 
      browser.Document.InvokeScript("execScript", new object[] { "function say_hello() { window.obj.WriteLine('Hello world') }" }); 

      browser.Document.InvokeScript("set_obj", new object[] { new Obj() }); 
      browser.Document.InvokeScript("say_hello"); 

      browser.Document.InvokeScript("setTimeout", new object[] { "say_hello()", 100 }); 
      Console.ReadKey(); 
     } 
    } 
} 

[ComVisible(true)] 
public sealed class Obj 
{ 
    public void WriteLine(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

即時呼び出しを起動されません。どうして?回避策はありますか?はなぜWebBrowserコントロールにsetTimeoutメソッドを経由して、スケジュールのコードは正常に動作しますが、私はsetTimeoutをを使用して、それを延期するとき、それが呼び出されていないsay_hello方法の

+0

私もsetTimeoutを引数として文字列の代わりに機能を渡そうとしました - それは助けにはならなかった。 \t browser.Document.InvokeScript(「setTimeoutを」、新しいオブジェクト[ ] {((dynamic)browser.Document.Window.DomWindow).say_hello、100}); –

答えて

4

ユーザー@controlflowが指摘したように、setTimeoutを動作させるにはアプリケーションでメッセージループが必要です。次の行を追加することができます:

Application.Run(new Form { Controls = { browser }, WindowState = FormWindowState.Minimized, ShowInTaskbar = false }); 
2

say_helloの後ろに括弧を入れてはいけません。なぜなら、そこに呼び出すのではなく、それを関数の代理人として渡すからです。したがって、試してみてください:

browser.Document.InvokeScript("setTimeout", new object[] { "say_hello", 100 }); 

また、コンソールにエラーはありますか?

更新

試してみてください。

browser.Document.InvokeScript("setTimeout(say_hello, 100);"); 

関連検索:

browser.Document.InvokeScript("setTimeout", new object[] { "say_hello", "100" }); 

問題が何であれ、どこかに飲み込まれるJavaScriptエラーはおそらくあります。レンダリングされたマークアップとスクリプトを書き出し、ブラウザの通常のWebページで実行してみてください。

+0

括弧を省略しても何も変わりません。いいえ、コンソールにエラーはありません。 –

0

あなたが

browser.Document.InvokeScript("say_hello()"); 

それはjavascriptの例外をスローに次の行

browser.Document.InvokeScript("say_hello"); 

を変更する必要があり、おそらくそれは実行しない、次のコマンドの理由です。

+0

要注意部分は含めないでください。ドキュメントを参照してください。http://msdn.microsoft.com/en-us/library/4b1a88bz.aspx – Kon

関連する問題