使用Graphics.GetHdc时,参数为Invalid Exception

时间:2011-12-10 21:42:24

标签: c# image graphics browser gdi

我一直在申请拍摄网站快照。 到目前为止,一切运作良好: 我有应用程序拍摄了很多照片,拍摄过程如下:

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代码的变化。与ILSpy一起使用。)

IntPtr hdc = graphics.GetHdc();线。

我找人问这个"参数无效"当使用GetHdc方法时,人们说这可能是因为没有释放先前的GDI对象。情况并非如此,因为Graphics对象使用using语句,位图也是如此......

我需要注意的是,我同时拥有许多网页浏览器(我从不销毁它们,我重新使用它们,这是我遇到的另一个错误,这是我能解决它的唯一方法......)

当我在TaskManager上查看GDI对象的数量时,我发现这是一个巨大的数额。但是 - 当我碰巧拥有最多的GDI对象时,错误没有发生...... 我想这些对象来自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 个答案:

答案 0 :(得分: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()。之后我从不使用调用graphics.GetHdc()。