【问题标题】:Using WebKit.NET to call a C# function from JavaScript使用 WebKit.NET 从 JavaScript 调用 C# 函数
【发布时间】:2025-12-22 04:10:18
【问题描述】:

我一直在 c# win forms 项目中使用 webkit.net,并且喜欢在 C# 程序中调用 JavaScript 函数是多么容易:

browser.Document.InvokeScriptMethod("functionName", new object[]{"parameter1", "parameter2"});

现在的问题是如何反过来做...是否有某种事件侦听器可以侦听 javascript 函数调用,或者通过在 webkit 浏览器中运行的 JavaScript 调用 c# 方法的任何方式?

我目前的做法是使用糟糕的 hack ... 查看可用的事件侦听器,我连接到 TitleChanged 事件,并读取隐藏的 input 的值html 中的字段 .... 这真的很糟糕,需要一个实际的解决方案。

提前致谢, - 格雷格。

【问题讨论】:

    标签: c# webkit


    【解决方案1】:
        public Form1()
        {
            InitializeComponent();
            webKitBrowser1.Navigating += new WebBrowserNavigatingEventHandler(Form1_Navigating);
        }
    
    
        private void Form1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
        {
            string url = e.Url.ToString();
            if (url.IndexOf("app://") > -1)
            {
                e.Cancel = true;
                processRequest(url);
            }
        }
    

    这可能无法通过您的 Ugly Hack 测试,但它是一种用于处理来自 .net 嵌入式浏览器的请求的古老方法。本质上,您在浏览器中拦截 URL GET 请求。如果 URL 包含关键字(例如 app://),则取消 GET 并处理 URL 参数。返回值,传统上是通过调用 Navigate 方法来完成的,但是,使用您在帖子中描述的方法,您可以直接调用 javascript 函数。

    【讨论】:

      【解决方案2】:

      github上有一个fork,它通过脚本对象添加了对此的支持(类似于标准winforms浏览器)。当浏览器加载时,您可以使用 webKitBrowser.ObjectForScripting = myObject 设置脚本对象,该类将处理您的 js 调用。然后从js你可以使用window.external.foo()调用方法。希望这会有所帮助。

      【讨论】:

      • 猜猜如果我包含链接会有所帮助:) github.com/scampy/webkitdotnet
      • 任何人都可以找到启用此功能的成功编译的 webkitdotnet 版本吗?谢谢。