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

Я добавил элемент управления 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);
            }
        }
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
438
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решено в китайском сообществе 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);
                    }
                }
            }
        }

Эта проблема должна была быть решена в версии 87.1.132, я бы рекомендовал перейти на более новую версию.

amaitland 21.02.2021 06:29

@amaitland Пробовал версию 87, но такое же исключение возникло даже на первом скриншоте 😂. «Сгенерированный идентификатор сообщения 2 не соответствует возвращаемому идентификатору сообщения 1». Оба абзаца кода имеют проблему.

No.5972 05.03.2021 09:24

Добро пожаловать, чтобы отправить PR с модульным тестом, который воспроизводит проблему, github.com/cefsharp/CefSharp/blob/cefsharp/88/CefSharp.Test/‌​… есть модульный тест, который вы можете использовать в качестве основы.

amaitland 05.03.2021 10:45

@amaitland PR отправлен в ветку master. Просто проверьте это. https://github.com/cefsharp/CefSharp/pull/3427

No.5972 08.03.2021 04:33

Другие вопросы по теме