CefGlue有一个现有的解决方案:在CefSharp 1中从javascript调用.Net - wpf
我想要这个,但对于CefGlue:我想使用JavaScript与应用程序进行通信。因此,当我单击HTML站点中的按钮时,我希望应用程序处理此问题(例如:启动tcp服务器)。
我尝试注册自己的 CefV8Handler,但没有成功,处理程序上的执行函数从未被调用。这是我现在所做的
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;
}
}
我处于多进程模式,没有控制台窗口显示"称为 TESTY"或"称为奇怪的东西"。
为此找到了解决方案。诀窍是创建一个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 函数中检索消息。