CEFSharp 不支持通知 API。 https://github.com/cefsharp/CefSharp/issues/2890 但是你可以自己实现。
使用 JavaScript 覆盖 Notification 构造函数,并将消息从 CEFSharp 发送到您的代码,方法是将其预先打包为 JSON。
public void OnFrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{
Browser.ExecuteScriptAsync(@"(function(){ class Notification {
static permission = 'granted';
static maxActions = 2;
static name = 'Notification';
constructor(title, options) {
let packageSet = new Set();
packageSet.add(title).add(options);
let json_package = JSON.stringify([...packageSet]);
CefSharp.PostMessage(json_package);
//alert(title);
}
static requestPermission() {
return new Promise((res, rej) => {
res('granted');
})
}
};
window.Notification = Notification;
})();");
}
接收消息并将其放入队列中。我使用Newtonsoft 从 JSON 中解包。
private void OnBrowserJavascriptMessageReceived(object sender, JavascriptMessageReceivedEventArgs e)
{
object[] objArray = JsonConvert.DeserializeObject<object[]>(e.Message.ToString());
Options options = JsonConvert.DeserializeObject<Options>(objArray[1].ToString(), new ImageConverter());
// Add to Notification queue
MessageQueue.Enqueue(new object[] { objArray[0], options });
}
MessageQueue 是数组对象的简单队列,然后我们在另一个线程中处理。
public Queue<object[]> MessageQueue = new Queue<object[]>();
通知结构。
public class Options
{
public byte[] icon { get; set; }
public string body { get; set; }
public string tag { get; set; }
public bool canReply { get; set; }
public bool silent { get; set; }
public bool requireInteraction { get; set; }
}
图像转换器
public class ImageConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(byte[]);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var str = reader.Value.ToString();
var index = reader.Value.ToString().IndexOf("base64,");
if (index == -1)
{
try
{
// Download the icon
Task<byte[]> task = App.ImageDownloaderObj.GetImageBytesAsync(new Uri(str));
task.Wait(500);
return task.Result;
}
catch { return new byte[] { }; }
}
else
{
var m = new MemoryStream(Convert.FromBase64String(str.Substring(index + 7)));
return m.ToArray();
}
//return (Bitmap)Image.FromStream(m);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Bitmap bmp = (Bitmap)value;
MemoryStream m = new MemoryStream();
bmp.Save(m, System.Drawing.Imaging.ImageFormat.Png);
writer.WriteValue(Convert.ToBase64String(m.ToArray()));
}
}