Я добавил элемент управления CEF в WinForm. И я добавил метод invokeCapture
, который, как ожидается, сделает снимок экрана всей страницы CEF. Он отлично работает при первом вызове. Но ошибки возникают после второго вызова и более, когда сообщение «Сгенерированный идентификатор сообщения 100002 не соответствует возвращенному идентификатору сообщения 100001». Как я могу сделать снимок экрана более одного раза?
Я скопировал код функции скриншота из https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/DevTools/DevToolsExtensions.cs в свой проект и переименовал его пространство имен в winformcefdemo.CefSharp.Example
.
Переменная lastMessageId
класса DevToolsClient
, в котором класс CaptureScreenshot
выполняет ExecuteDevToolsMethodAsync
для запуска команды "Page.CaptureScreenshot", является приватной и для нее нет ни геттера, ни сеттера. Кажется, это раздражает. Метод ExecuteDevToolsMethodAsync
захочет сравнить идентификатор сообщения, возвращаемого методом ExecuteDevToolsMethod
, с автоматически увеличенным идентификатором сообщения самого DevToolsClient
. DevtoolsClient
в методе CaptureScreenShotAsPng
— это то, что возвращает browser.GetDevToolsClient()
(в строке 36 ссылки выше). А еще я проверил реализацию метода GetDevToolsClient
. Он также использует DevToolsClient devToolsClient = new DevToolsClient(browser);
в CefSharp.DevToolsExtensions
.
private async void invokeCapture()
{
try
{
byte[] result = await winformcefdemo.CefSharp.Example.DevTools.DevToolsExtensions.CaptureScreenShotAsPng(browser);
// task.Start();
// byte[] result = task.Result;
SaveFileDialog dialog = new SaveFileDialog();
DialogResult dresult = dialog.ShowDialog();
if (dresult == DialogResult.OK)
{
string path = dialog.FileName;
try
{
File.WriteAllBytes(path, result);
MessageBox.Show(path + " saved success");
} catch (Exception e)
{
MessageBox.Show(path + "Unknown error occurred when saving to file: " + e.Message);
}
}
}
catch (Exception ee)
{
MessageBox.Show("Unknown error occurred when capturing: " + ee.Message);
}
}
Решено в китайском сообществе CSDN
Используйте нет DevToolsExtensions
. Вместо этого используйте PageClient
. DevToolsExtensions
есть проблемы, которые не решены.
И PageClient
должен быть определен глобально. Не определяйте его в методе.
# Source: https://bbs.csdn.net/topics/398544662
CefSharp.DevTools.Page.PageClient pageClien= null;
private async void invokeCapture()
{
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);
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "PNG Picture (*.PNG)|*.PNG";
DialogResult dresult = dialog.ShowDialog();
if (dresult == DialogResult.OK)
{
string path = dialog.FileName;
try
{
File.WriteAllBytes(path, result);
MessageBox.Show(path + " saved success");
} catch (Exception e)
{
MessageBox.Show(path + "Unknown error occurred when saving to file: " + e.Message);
}
}
}
}
@amaitland Пробовал версию 87, но такое же исключение возникло даже на первом скриншоте 😂. «Сгенерированный идентификатор сообщения 2 не соответствует возвращаемому идентификатору сообщения 1». Оба абзаца кода имеют проблему.
Добро пожаловать, чтобы отправить PR с модульным тестом, который воспроизводит проблему, github.com/cefsharp/CefSharp/blob/cefsharp/88/CefSharp.Test/… есть модульный тест, который вы можете использовать в качестве основы.
@amaitland PR отправлен в ветку master
. Просто проверьте это. https://github.com/cefsharp/CefSharp/pull/3427
Эта проблема должна была быть решена в версии 87.1.132, я бы рекомендовал перейти на более новую версию.