मैंने WinForm में CEF नियंत्रण जोड़ा है। और मैंने एक invokeCapture विधि जोड़ी है जिससे सीईएफ के पूरे पृष्ठ के स्क्रीन शॉट को कैप्चर करने की उम्मीद है। पहली बार लागू होने पर यह ठीक काम करता है। लेकिन दूसरी इनवोकिंग और अधिक के बाद से त्रुटियों का सामना करना पड़ता है, जो संदेश "जेनरेटेड मैसेज आईडी 100002 मेल नहीं खाता संदेश आईडी 100001" से मेल नहीं खाता है। मैं स्क्रीन शॉट को एक से अधिक बार कैसे कैप्चर कर सकता हूं?

मैंने स्क्रीनशॉट फ़ंक्शन कोड को https:// से कॉपी किया है। मेरे प्रोजेक्ट में github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/DevTools/DevToolsExtensions.cs और इसके नामस्थान का नाम बदलकर winformcefdemo.CefSharp.Example कर दिया।

कक्षा DevToolsClient का वेरिएबल lastMessageId, जिसमें क्लास CaptureScreenshot कमांड "Page.CaptureScreenshot" चलाने के लिए ExecuteDevToolsMethodAsync निष्पादित करता है, निजी है और या तो कोई गेटर नहीं है और न ही इसे सेट करें। ऐसा लगता है कि यह कष्टप्रद है। विधि 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);
            }
        }
0
No.5972 17 पद 2020, 06:41

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);
                    }
                }
            }
        }
0
No.5972 20 फरवरी 2021, 23:38
1
इस मुद्दे को संस्करण 87.1.132 में हल किया जाना चाहिए था, एक नए संस्करण में अपग्रेड करना मेरी सिफारिश होगी।
 – 
amaitland
21 फरवरी 2021, 08:29
संस्करण 87 की कोशिश की लेकिन पहले स्क्रीनशॉट पर भी वही अपवाद हुआ। "जेनरेट किया गया MessageId 2 लौटाए गए Message Id 1 से मेल नहीं खाता"। कोड के दोनों दो पैराग्राफ में समस्या है।
 – 
No.5972
5 मार्च 2021, 11:24
समस्या को पुन: उत्पन्न करने वाले इकाई परीक्षण के साथ पीआर सबमिट करने के लिए आपका स्वागत है, github.com/cefsharp/CefSharp/blob/cefsharp/88/CefSharp.Test/… में एक इकाई परीक्षण है जिसे आप आधार के रूप में उपयोग कर सकते हैं।
 – 
amaitland
5 मार्च 2021, 12:45
पीआर को master शाखा में जमा किया जाता है। बस इसे जांचें। https://github.com/cefsharp/CefSharp/pull/3427
 – 
No.5972
8 मार्च 2021, 06:33