#c# #devtools #chromium-embedded
#c# #devtools #встроенный в chromium
Вопрос:
Я добавил элемент управления 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
для запуска команды «Страница.CaptureScreenshot» является закрытым, и для него нет ни средства получения, ни средства установки. Кажется, это раздражает. Метод ExecuteDevToolsMethodAsync
хотел бы сравнить идентификатор сообщения того, что ExecuteDevToolsMethod
возвращает метод, с автоматически увеличенным идентификатором DevToolsClient
самого сообщения. DevtoolsClient
В методе CaptureScreenShotAsPng
это то, что browser.GetDevToolsClient()
возвращает (в строке 36 ссылки выше). И я также проверил реализацию метода GetDevToolsClient
. Он также использует DevToolsClient devToolsClient = new DevToolsClient(browser);
in CefSharp.DevToolsExtensions
.
private async void invokeCapture()
{
try
{
byte[] result = await winformcefdemo.CefSharp.Example.DevTools.DevToolsExtensions.CaptureScreenShotAsPng(browser);
// task.Start();
// byte[] result = task.Resu<
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);
}
}
Ответ №1:
Решаемая в китайском сообществе CSDN
Используйте no 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);
}
}
}
}
Комментарии:
1. Эта проблема должна была быть решена в версии 87.1.132, моей рекомендацией было бы обновление до более новой версии.
2. @amaitland попробовал версию 87, но то же исключение возникло даже на первом скриншоте 😂. «Сгенерированный идентификатор сообщения 2 не соответствует идентификатору возвращенного сообщения 1». Проблема возникает в обоих двух абзацах кода.
3. Пожалуйста, отправьте PR с модульным тестом, который воспроизводит проблему, github.com/cefsharp/CefSharp/blob/cefsharp/88/CefSharp.Test /… имеет модульный тест, который вы можете использовать в качестве основы.
4. @amaitland PR отправляется в
master
ветку. Просто проверьте это. https://github.com/cefsharp/CefSharp/pull/3427