使用 CEF devtools ExecuteDevToolsMethodAsync 和 Page.captureScreenshot 时消息 ID 出错

message id went wrong when using CEF devtools ExecuteDevToolsMethodAsync and Page.captureScreenshot

我已将 CEF 控件添加到 WinForm 中。并且我添加了一个 invokeCapture 方法,该方法有望捕获 CEF 整个页面的屏幕截图。第一次调用时它工作正常。但是自第二次调用以来遇到了错误,消息是“Generated MessageID 100002 doesn't match returned Message Id 100001”。如何多次捕获屏幕截图?

我已经将https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/DevTools/DevToolsExtensions.cs中的截图功能代码复制到我的项目中,并将其命名空间重命名为winformcefdemo.CefSharp.Example

classDevToolsClient的变量lastMessageId,其中classCaptureScreenshot执行ExecuteDevToolsMethodAsync是为了运行 命令“Page.CaptureScreenshot”是私有的,没有 getter 也没有 setter。这似乎很烦人。方法 ExecuteDevToolsMethodAsync 想要将方法 ExecuteDevToolsMethod returns 的消息 ID 与 DevToolsClient 本身自动增加的消息 ID 进行比较。方法CaptureScreenShotAsPng中的DevtoolsClient就是browser.GetDevToolsClient()returns(在上面link的第36行)。而且我还检查了方法 GetDevToolsClient 的实现。它也在 CefSharp.DevToolsExtensions.

中使用 DevToolsClient devToolsClient = new DevToolsClient(browser);
        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);
                    }
                }
            }
        }