javascript - 使用 CefGlue/CE​​F3 从 JavaScript 调用 .NET

标签 javascript c# chromium-embedded cefglue

CefGlue 有一个现有的解决方案:Call .Net from javascript in CefSharp 1 - wpf

我正是想要这个,但对于 CefGlue:我想使用 JavaScript 与应用程序进行通信。因此,当我单击 HTML 站点中的按钮时,我希望应用程序能够处理此问题(例如:启动 TCP 服务器)。

我尝试注册一个自己的 CefV8Handler 但没有成功,处理程序上的 Execute 函数从未被调用。这就是我现在所做的

    protected override void OnWebKitInitialized()
    {
        Console.WriteLine("Registering testy extension");
        Xilium.CefGlue.CefRuntime.RegisterExtension("testy", "var testy;if (!testy)testy = {};(function() {testy.hello = function() {};})();", new V8Handler());
        base.OnWebKitInitialized();
    }

我的 V8Handler 代码如下所示:

public class V8Handler : Xilium.CefGlue.CefV8Handler
{

    protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
    {

        if (name == "testy")
            Console.WriteLine("CALLED TESTY");
        else
            Console.WriteLine("CALLED SOMETHING WEIRED ({0})", name);

        returnValue = CefV8Value.CreateNull();
        exception = null;
        return true;

    }

}

我处于多进程模式,没有控制台窗口显示“CALLED TESTY”或“CALLED SOMETHING WIRED”。

最佳答案

找到了解决方案。诀窍是创建一个 CefV8Value (CreateFunction) 并将其分配给 V8Handler。然后将此值分配给全局上下文。它看起来像这样:

internal class RenderProcessHandler : CefRenderProcessHandler
{

    protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
    {
        CefV8Value global = context.GetGlobal();
        CefV8Value func = CefV8Value.CreateFunction("magic", new V8Handler());
        global.SetValue("magic", func, CefV8PropertyAttribute.None);
        base.OnContextCreated(browser, frame, context);
    }

}

又出现了一个问题:它是在渲染器进程中调用的,但我需要在浏览器进程中回调。在 CefV8Handlers 执行函数中我这样做了:

var browser = CefV8Context.GetCurrentContext().GetBrowser();
browser.SendProcessMessage(CefProcessId.Browser, CefProcessMessage.Create("ipc-js." + name));

这样我就可以在 CefClient 实现的 OnProcessMessageReceived 函数中检索消息。

关于javascript - 使用 CefGlue/CE​​F3 从 JavaScript 调用 .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30856305/

相关文章:

javascript - 如何获取数组 Node.js 中的最后一项?

c# - 如何将 List<string> 分配给 JavaScript 数组或可枚举对象

c# - 如何在没有异步的情况下使用 HttpClient

javascript - Knockout Js 中 Uncaught ReferenceError

c# - 无法在 Chromium 嵌入式框架中播放视频 (mp4)

javascript - javascript 旋转器内的标签不会点击

javascript - 单击子项时如何更改(添加或删除)<ul> 子项内的类

javascript - 选择最接近克隆元素的 h2 标题

c++ - 链接 CEF3 的问题

chromium-embedded - 本地文件系统中带有 html/js 文件的 Cefpython 应用程序