Search code examples
c#devtoolschromium-embedded

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


I have added a CEF control into a WinForm. And I have added an invokeCapture method that is expected to capture the screen shot of the entire page of the CEF. It works fine when first invoking. But errors are encountered since second invoking and more, which the message is "Generated MessageID 100002 doesn't match returned Message Id 100001". How can I capture screen shot more than once?

I have copied the screenshot function code from https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/DevTools/DevToolsExtensions.cs to my project and renamed the namespace of it to winformcefdemo.CefSharp.Example.

The variable lastMessageId of the class DevToolsClient, in which class CaptureScreenshot executes ExecuteDevToolsMethodAsync in order to run command "Page.CaptureScreenshot", is private and there are either no getter nor setter to it. It seems to be annoying. The method ExecuteDevToolsMethodAsync would want to compare the message ID of what the method ExecuteDevToolsMethod returns to the automatically increased message ID of the DevToolsClient itself. The DevtoolsClient in the method CaptureScreenShotAsPng is what browser.GetDevToolsClient() returns (in the line 36 of the link above). And I have also checked the implementation of the method GetDevToolsClient. It is also using 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.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);
            }
        }

Solution

  • Solved in Chinese community of CSDN

    Use no DevToolsExtensions. Use PageClient Instead. DevToolsExtensions does have issues that are not solved.

    And PageClient should be defined globally. Do not define it in the method.

            # 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);
                        }
                    }
                }
            }