2011-12-10 15 views
5

मैं वेबसाइटों के स्नैपशॉट लेने के लिए एक आवेदन कर रहा हूं। सब कुछ अच्छी तरह से काम करता है, अब तक: मैं आवेदन कई तस्वीरें लेने के लिए है, और छवि लेने की प्रक्रिया के रूप में किया जाता है निम्नलिखित:ग्राफिक्स का उपयोग करते समय पैरामीटर अमान्य अपवाद है। GetHdc

using (Graphics graphics = Graphics.FromImage(mBitmap)) 
{ 
    IntPtr hdc = graphics.GetHdc(); 
    SendMessage(new HandleRef(mWebBrowser, mWebBrowser.Handle), 791, hdc, (IntPtr)30); 
    BitBlt(new HandleRef(graphics, hdc), 0, 0, mBitmap.Width, mBitmap.Height, new HandleRef(graphics, hdc), 0, 0, 13369376); 
    graphics.ReleaseHdc(); 
} 

(इस WebBrowser नियंत्रण से DrawToBitmap के कोड की घटती-बढ़ती है आईएलएसपी के साथ लिया गया)।

त्रुटि IntPtr hdc = graphics.GetHdc() पर होती है; लाइन।

मैंने गेटएचडीसी विधि का उपयोग करते समय लोगों को "पैरामीटर अमान्य" के बारे में पूछने की मांग की, और लोगों ने कहा कि यह पूर्व जीडीआई वस्तुओं को जारी नहीं करने के कारण हो सकता है। यह मामला नहीं है, क्योंकि ग्राफिक्स ऑब्जेक्ट एक उपयोग कथन के साथ है, और इसलिए बिटमैप है ...

मुझे यह ध्यान रखना होगा कि मेरे पास एक ही समय में कई वेबब्रोसर हैं (मैंने उन्हें कभी नष्ट नहीं किया है, मैं पुनः- उनका उपयोग करें, यह मेरी एक और त्रुटि के लिए है और यह एकमात्र तरीका है जिसे मैं हल कर सकता हूं ...)

जब मैं जीडीआई ऑब्जेक्ट की मात्रा पर टास्कमेनगर को देख रहा हूं, तो मुझे लगता है कि यह एक विशाल है रकम। लेकिन - त्रुटि तब नहीं हुई जब मेरे पास सबसे अधिक जीडीआई ऑब्जेक्ट्स ... मुझे लगता है कि इस ऑब्जेक्ट की मात्रा WebBrowsers से आती है ...?

ILSpy से मूल DrawToBitmap कोड है:

int nWidth = Math.Min(this.Width, targetBounds.Width); 
int nHeight = Math.Min(this.Height, targetBounds.Height); 
Bitmap image = new Bitmap(nWidth, nHeight, bitmap.PixelFormat); 
using (Graphics graphics = Graphics.FromImage(image)) 
{ 
    IntPtr hdc = graphics.GetHdc(); 
    UnsafeNativeMethods.SendMessage(new HandleRef(this, this.Handle), 791, hdc, (IntPtr)30); 
    using (Graphics graphics2 = Graphics.FromImage(bitmap)) 
    { 
     IntPtr hdc2 = graphics2.GetHdc(); 
     SafeNativeMethods.BitBlt(new HandleRef(graphics2, hdc2), targetBounds.X, targetBounds.Y, nWidth, nHeight, new HandleRef(graphics, hdc), 0, 0, 13369376); 
     graphics2.ReleaseHdcInternal(hdc2); 
    } 
    graphics.ReleaseHdcInternal(hdc); 
} 

प्रलेखन का दावा है कि Webbrowser DrawToBitmap का समर्थन नहीं करता, लेकिन यह कुछ चरण जब यह सिर्फ इस अपवाद फेंकता है जब तक अच्छी तरह से काम करता है।

+1

उपलब्ध हैंडल की _total_ राशि के लिए सिस्टम सीमा है। लेकिन मैंने सोचा कि यह इन दिनों बल्कि उच्च था। –

+0

मैं थोड़ा उलझन में हूं कि आप एक ही कॉल के लिए एकाधिक 'हैंडलरफ' क्यों बना रहे हैं। आप शायद 'var href = new हैंडलरफ (ग्राफिक्स, एचडीसी)' लिखने से बेहतर हैं, और उसके बाद दोनों स्थानों में 'बिटबल्ट' को रेफरी कर रहे हैं। उस ने कहा, यह स्पष्ट रूप से समस्या नहीं है? मुझे आश्चर्य है कि आप 'Graphics.DrawImage' या somesuch का उपयोग करने के बजाय 'बिटबल्ट' क्यों कॉल कर रहे हैं। –

+0

वेबब्रोसर छुपा हुआ है। जैसा कि मैंने संश्लेषण में कहा था, यह कोड System.windows.forms पर आईएलएसपीआई से लिया गया कोड से भिन्न था। मैंने ऐसा इसलिए किया क्योंकि मैं WebBrowser का उपयोग करने के बजाय, खुशी के बारे में उच्च स्तर पर नियंत्रण रखना चाहता था। DrawToBitmap। हैंडलरफ्स के बारे में टिप्पणी के लिए धन्यवाद। –

उत्तर

1

यहां तक ​​कि इस पोस्ट, बहुत पुरानी मैं इस समस्या को हल करने में मदद करना चाहते है, क्योंकि मैं एक ही था और मैं इसे इस तरह से हल:

private static Graphics graphics = null; 
private static IntPtr hdc = IntPtr.Zero; 
private static IntPtr dstHdc = IntPtr.Zero; 

private static Capture() 
{ 
    if (graphics == null) 
    { 
     hdc = GetDC(IntPtr.Zero); 
     graphics = Graphics.FromImage(bitmap); 
     dstHdc = graphics.GetHdc(); 
    } 
    BitBlt(dstHdc, 0, 0, screen_resolution.Width, screen_resolution.Height, hdc, 0, 0, RasterOperation.SRC_COPY); 
} 

मेरे लिए समाधान था, कि मैं graphics.GetHdc फोन() केवल एक बार जब वस्तु शून्य है। इसके बाद मैं कभी भी कॉल ग्राफिक्स का उपयोग नहीं करता। GetHdc()।

संबंधित मुद्दे