Параметр является недопустимым исключением при использовании Graphics.GetHdc - PullRequest
5 голосов
/ 11 декабря 2011

Я подал заявку на создание снимков веб-сайтов. Все работает хорошо, до сих пор: У меня есть приложение, чтобы сделать МНОГО фотографий, и процесс получения изображения выполняется следующим образом:

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

(это отличается от кода DrawToBitmap из элемента управления WebBrowser. Взят с ILSpy).

Ошибка возникает в IntPtr hdc = graphics.GetHdc (); линия.

Я искал людей, спрашивающих об этом «Параметр недействителен» при использовании метода GetHdc, и люди говорили, что это может быть из-за не выпускаемых ранее объектов GDI. это не так, поскольку объект Graphics использует оператор using, как и растровое изображение ...

Я должен отметить, что у меня есть много веб-браузеров одновременно (я никогда не уничтожаю их, я повторно использую их, это из-за другой ошибки, которая была у меня, и это был единственный способ, которым я мог ее исправить ...)

Когда я смотрю на TaskManager количество объектов GDI, я вижу, что это огромное количество. Но - ошибка не произошла, когда у меня оказалось больше всего объектов GDI ... Я предполагаю, что это количество объектов происходит из WebBrowsers ...?

Исходный код DrawToBitmap из ILSpy:

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 Ответ

1 голос
/ 05 декабря 2015

Даже этот пост очень старый, я хочу помочь решить эту проблему, потому что у меня было то же самое, и я решил это следующим образом:

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

Решение для меня было, что я называю графикой.GetHdc () только один раз, когда объект равен нулю.После этого я никогда не использую call graphics.GetHdc ().

...