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