ошибка с идентификатором сообщения произошла при использовании CEF devtools ExecuteDevToolsMethodAsync и Page.CaptureScreenshot

#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