为什么 CefSharp.PostMessage 不能在 CefSharp 浏览器中工作?

Why won't CefSharp.PostMessage work in CefSharp browser?

我尝试在 c# 中使用 JavascriptMessageReceived 事件来处理浏览器中从 JS 调用的 CefSharp.PostMessage。我什至从 link 下载了这个工作的例子。 运行 本应完全满足我的需求的示例,但它不起作用,我的代码(如下)也不起作用。 CefSharp 是否删除或更改了此功能?我需要在 CefSettings 或 ChromiumWebBrowser 中启用此功能吗?

using CefSharp;
using CefSharp.WinForms;

public ChromiumWebBrowser chromeBrowser;

public Form1()
    {
        InitializeComponent();

        string curDir = Directory.GetCurrentDirectory();
        CefSettings settings = new CefSettings();
        Cef.Initialize(settings);
        chromeBrowser = new ChromiumWebBrowser(String.Format("file:///{0}/HelloWorld.html", curDir));
        chromeBrowser.JavascriptMessageReceived += ChromeBrowser_JavascriptMessageReceived;
    }

private void ChromeBrowser_JavascriptMessageReceived(object sender, JavascriptMessageReceivedEventArgs e)
    {
        MessageBox.Show((string)e.Message);
    }

HelloWorld.html这里

<!DOCTYPE html>
<html>
<body>

<script>
CefSharp.PostMessage("Hello world!");
</script>

</body>
</html>
  1. CefSharp.PostMessage("Hello world!"); 是 2020 年的一个相当新的 JS 扩展。确保您使用的是实际的 CefSharp。
  2. chromeBrowser = new ChromiumWebBrowser(String.Format("file:///{0}/HelloWorld.html", curDir));
    chromeBrowser.JavascriptMessageReceived += ChromeBrowser_JavascriptMessageReceived;
    
    JavascriptMessageReceived 事件的订阅太晚了,页面可能会被下载并且 JS 可能会执行到那个时刻。您应该在页面加载之前订阅事件。
    chromeBrowser = new ChromiumWebBrowser("about:blank");
    chromeBrowser.JavascriptMessageReceived += ChromeBrowser_JavascriptMessageReceived;
    chromeBrowser.Load(String.Format("file:///{0}/HelloWorld.html", curDir));
    
  3. 确保 HelloWorld.html 存在于应用程序当前工作目录中。

您要在何处将 ChromiumWebBrowser 添加到表单中? WinForms ChromiumWebBrowser 控件在创建句柄之前不会加载,默认情况下,在将其添加到父级时会发生这种情况。

chromeBrowser = new ChromiumWebBrowser(String.Format("file:///{0}/HelloWorld.html", curDir));
chromeBrowser.JavascriptMessageReceived += ChromeBrowser_JavascriptMessageReceived;
Controls.Add(chromeBrowser);