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);
    }
}

立即调用 say_hello 方法可以正常工作,但是当我使用 setTimeout 推迟它时,它不会被调用。为什么?有什么解决方法吗?

4

3 回答 3

4

正如用户@controlflow指出的那样,我需要在我的应用程序中使用一个消息循环来使 setTimeout 工作。添加以下行有助于:

Application.Run(new Form { Controls = { browser }, WindowState = FormWindowState.Minimized, ShowInTaskbar = false });
于 2011-07-05T20:36:38.270 回答
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 错误。尝试写出渲染的标记和脚本,并在浏览器的普通网页中运行它。

于 2011-07-05T18:33:14.977 回答
0

您应该更改以下行

browser.Document.InvokeScript("say_hello");

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

它抛出一个javascript异常,可能是下一个命令不执行的原因。

于 2011-07-05T19:10:34.740 回答