发现多种内核浏览器现在截图结果是一片空白,自己试了一下,自带的WebBrowser可以,但IE内核就算了。直接用CefSharp,发现各种截图都是一片黑,看到了DevToolsExtensions,使用后,发现只能截图一次,第二次就出异常了。Generated MessageId 100002 doesn't match returned Message Id 100001。下载源码,来到DevToolsClient.cs
public async Task<DevToolsMethodResponse> ExecuteDevToolsMethodAsync(string method, IDictionary<string, object> parameters = null)
{
if (browser == null || browser.IsDisposed)
{
//TODO: Queue up commands where possible
return new DevToolsMethodResponse { Success = false };
}
Console.WriteLine("lastMessageId:{0}", lastMessageId);
var messageId = Interlocked.Increment(ref lastMessageId);
lastMessageId = messageId;
Console.WriteLine("messageId:{0}", messageId);
var taskCompletionSource = new SyncContextTaskCompletionSource<DevToolsMethodResponse>();
taskCompletionSource.SyncContext = CaptureSyncContext ? SynchronizationContext.Current : syncContext;
if (!queuedCommandResults.TryAdd(messageId, taskCompletionSource))
{
throw new DevToolsClientException(string.Format("Unable to add MessageId {0} to queuedCommandResults ConcurrentDictionary.", messageId));
}
var browserHost = browser.GetHost();
//Currently on CEF UI Thread we can directly execute
if (CefThread.CurrentlyOnUiThread)
{
Console.WriteLine("Currently on CEF UI Thread");
var returnedMessageId = browserHost.ExecuteDevToolsMethod(messageId, method, parameters);
if (returnedMessageId == 0)
{
return new DevToolsMethodResponse { Success = false };
}
else if(returnedMessageId != messageId)
{
//For some reason our message Id's don't match
throw new DevToolsClientException(string.Format("Generated MessageId {0} doesn't match returned Message Id {1}", returnedMessageId, messageId));
}
}
//ExecuteDevToolsMethod can only be called on the CEF UI Thread
else if (CefThread.CanExecuteOnUiThread)
{
Console.WriteLine("ExecuteDevToolsMethod can only be called on the CEF UI Thread");
var returnedMessageId = await CefThread.ExecuteOnUiThread(() =>
{
return browserHost.ExecuteDevToolsMethod(messageId, method, parameters);
}).ConfigureAwait(false);
if (returnedMessageId == 0)
{
return new DevToolsMethodResponse { Success = false };
}
else if (returnedMessageId != messageId)
{
//For some reason our message Id's don't match
throw new DevToolsClientException(string.Format("Generated MessageId {0} doesn't match returned Message Id {1}", returnedMessageId, messageId));
}
}
else
{
throw new DevToolsClientException("Unable to invoke ExecuteDevToolsMethod on CEF UI Thread.");
}
return await taskCompletionSource.Task;
}
输出lastMessageId,发现每次调用都会被重置回100000,而直接调用ExecuteDevToolsMethod,每次returnedMessageId都用+1,看了一个CEF源码,nextid会自加1,发现DevToolsExtensions中的方法每次都会重置了,browser.GetDevToolsClient()每次都会重置,于是直接把pageClient先保存起来,不再每次去GetDevToolsClient,成功截图
CefSharp.DevTools.Page.PageClient pageClien= null;
private async void Test2()
{
if(pageClien==null)
{
pageClien = webBrowser.GetBrowser().GetDevToolsClient().Page;
}
var result = await pageClien.CaptureScreenshotAsync();
if (result.Data!=null)
{
MemoryStream ms = new MemoryStream(result.Data);
ms.Write(result.Data, 0, result.Data.Length);
pictureBox1.Image = Image.FromStream(ms);
//File.WriteAllBytes("1.bmp", result.Data);保存图片
}
}