为什么 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>
CefSharp.PostMessage("Hello world!");
是 2020 年的一个相当新的 JS 扩展。确保您使用的是实际的 CefSharp。
-
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));
- 确保 HelloWorld.html 存在于应用程序当前工作目录中。
您要在何处将 ChromiumWebBrowser 添加到表单中? WinForms ChromiumWebBrowser 控件在创建句柄之前不会加载,默认情况下,在将其添加到父级时会发生这种情况。
chromeBrowser = new ChromiumWebBrowser(String.Format("file:///{0}/HelloWorld.html", curDir));
chromeBrowser.JavascriptMessageReceived += ChromeBrowser_JavascriptMessageReceived;
Controls.Add(chromeBrowser);
我尝试在 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>
CefSharp.PostMessage("Hello world!");
是 2020 年的一个相当新的 JS 扩展。确保您使用的是实际的 CefSharp。-
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));
- 确保 HelloWorld.html 存在于应用程序当前工作目录中。
您要在何处将 ChromiumWebBrowser 添加到表单中? WinForms ChromiumWebBrowser 控件在创建句柄之前不会加载,默认情况下,在将其添加到父级时会发生这种情况。
chromeBrowser = new ChromiumWebBrowser(String.Format("file:///{0}/HelloWorld.html", curDir));
chromeBrowser.JavascriptMessageReceived += ChromeBrowser_JavascriptMessageReceived;
Controls.Add(chromeBrowser);