无法使用CefSharp.PostMessage时,如何捕获window.parent.postMessage消息?
解决CefSharp捕获网页window.parent.postMessage消息的问题
问题分析
你测试代码失效的核心原因有两个:
- JS方法名大小写错误:
window.parent.postmessage应为window.parent.postMessage(JavaScript是大小写敏感语言) - 重定向导致脚本注入失效:页面经过多次重定向后,之前注入的脚本会随页面刷新被清除,需要在目标页面加载完成后重新注入
解决方案
通过重写网页的window.parent.postMessage方法,将消息转发给CefSharp.PostMessage,同时确保脚本在目标页面加载完成后注入,具体步骤如下:
- 绑定JavascriptMessageReceived事件
确保在ChromiumWebBrowser初始化时绑定消息接收事件(比如在窗体构造函数中):
public YourForm() { InitializeComponent(); // 绑定消息接收事件 chromiumWebBrowser1.JavascriptMessageReceived += ChromiumWebBrowser1_JavascriptMessageReceived; }
- 修正脚本注入逻辑
在FrameLoadEnd事件中,针对重定向后的目标页面注入脚本,重写postMessage方法:
private void ChromiumWebBrowser1_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e) { // 可根据目标页面的URL特征判断是否注入脚本,避免无效注入 var currentUrl = e.Frame.Url; if (currentUrl.Contains("目标页面的URL关键字")) { chromiumWebBrowser1.ExecuteScriptAsync(@" // 保存原始postMessage方法,保留页面原有逻辑 const originalPostMessage = window.parent.postMessage; // 重写postMessage方法 window.parent.postMessage = function(message, targetOrigin, transfer) { // 将消息转发给CefSharp CefSharp.PostMessage(message); // 调用原始方法,不破坏页面原有功能(不需要可删除此行) originalPostMessage.call(window.parent, message, targetOrigin, transfer); }; "); } }
- 处理接收的消息
在消息接收事件中解析和处理网页传递的内容:
private void ChromiumWebBrowser1_JavascriptMessageReceived(object sender, JavascriptMessageReceivedEventArgs e) { // 转换消息格式,根据实际数据类型调整 var receivedMessage = e.Message.ToString(); // 这里添加你的业务逻辑,比如输出到控制台或更新UI Console.WriteLine("捕获到postMessage消息:" + receivedMessage); }
额外注意事项
- 如果网页中的
postMessage是在iframe内调用的,需要去掉e.Frame.IsMain的判断,监听所有帧的加载完成事件 - 若不需要保留页面原有
postMessage逻辑,可以删除调用originalPostMessage的代码 - 确保使用的CefSharp版本为较新版本,避免兼容性问题
内容的提问来源于stack exchange,提问作者JustLooking
相关产品推荐
相关产品推荐

