C # CEF utiliza herramientas de desarrollo integradas para tomar capturas de pantalla de toda la página web

Actualización del 21.01.18: El gran tipo del foro CSDN dio una solución , puedes llamar a la captura de pantalla varias veces. También publicado aquí como referencia.
Aquí se cambia para usar variables globales PageClientpara almacenar temporalmente objetos de página. Porque si coloca esta declaración de definición en el método, aún informará el error "El ID de mensaje generado 100002 no coincide con el ID de mensaje devuelto 100001", por lo que debe colocarse en una variable global.

        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图片 (*.PNG)|*.PNG";
                DialogResult dresult = dialog.ShowDialog();
                if (dresult == DialogResult.OK)
                {
    
    
                    string path = dialog.FileName;
                    try
                    {
    
    
                        File.WriteAllBytes(path, result.Data);
                        MessageBox.Show(path + "保存成功。");
                    }
                    catch (Exception e)
                    {
    
    
                        MessageBox.Show(path + "保存失败!错误信息:" + e.Message);
                    }
                }
            }
        }

Una ventaja de esto es que no es necesario llamar a la API de bajo nivel de Win32. Puede tomar una captura de pantalla tomando directamente el método del componente CEF, y no necesita dedicar todo el OffScreencomponente. Después de todo, debe copiar y heredar, y también ocupa memoria. E incluso si la ventana CEF excede la pantalla, o está bloqueada por otras ventanas, o incluso usa medios especiales para ampliar la ventana a una resolución mayor que la pantalla, este método también puede ser interceptado.
Pero este método solo puede tomar una captura de pantalla una vez, no varias veces. Debes salir y reiniciar para continuar con la captura de pantalla. La segunda captura de pantalla informará el error "El ID de mensaje generado 100002 no coincide con el ID de mensaje devuelto 100001". No existe una solución en línea, incluidas las comunidades extranjeras. Ya hice esta pregunta en StackOverflow. Copie
el código https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/DevTools/DevToolsExtensions.cs en Github , colóquelo en el proyecto y cambie el espacio de nombres. Entonces puede llamar directamente al control CEF. Aquí se utiliza la GUI que muestra WinForm. Luego, escribe el método en el código para llamarlo.

        private async void invokeCapture()
        {
    
    
            try
            {
    
    
                byte[] result = await CefSharp.Example.DevTools.DevToolsExtensions.CaptureScreenShotAsPng(browser); // browser是CEF控件实例
                SaveFileDialog dialog = new SaveFileDialog();
                dialog.Filter = "PNG图片 (*.PNG)|*.PNG";
                DialogResult dresult = dialog.ShowDialog();
                if (dresult == DialogResult.OK)
                {
    
    
                    string path = dialog.FileName;
                    try
                    {
    
    
                        File.WriteAllBytes(path, result);
                        MessageBox.Show(path + "保存成功。");
                        
                    } catch (Exception e)
                    {
    
    
                        MessageBox.Show(path + "保存失败!错误信息:" + e.Message);
                    }
                }

            }
            catch (Exception ee)
            {
    
    
                MessageBox.Show("目前暂时只支持截一次图,暂时不支持截更多次数的图片,如果要继续截图得退出程序重开。作者确实没法解决这个问题了,谁有好的想法也欢迎提出来,具体详情请关注https://stackoverflow.com/questions/65334430/message-id-went-wrong-when-using-cef-devtools-executedevtoolsmethodasync-and-pag 。相关技术细节:" + ee.Message, "暂不支持的操作", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

Supongo que te gusta

Origin blog.csdn.net/qq_35977139/article/details/111319817
Recomendado
Clasificación