Параметр является недопустимым исключением при использовании Graphics.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();
}
(это отличается от кода DrawToBitmap от элемента управления WebBrowser. взят с ILSpy).
Ошибка происходит в IntPtr hdc = graphics.GetHdc(); линия.
Я искал людей, спрашивающих об этом "Неверный параметр" при использовании метода GetHdc, и люди говорили, что это может быть из-за того, что не были выпущены предыдущие объекты GDI. это не так, поскольку объект Graphics использует оператор using, как и растровое изображение...
Я должен отметить, что у меня есть много веб-браузеров одновременно (я никогда не уничтожаю их, я повторно использую их, это из-за другой ошибки, которая была у меня, и это был единственный способ, которым я мог ее исправить...)
Когда я смотрю на TaskManager количество объектов GDI, я вижу, что это огромное количество. Но - ошибка не произошла, когда у меня оказалось больше всего объектов GDI... Я предполагаю, что это количество объектов происходит из веб-браузеров...?
Исходный код 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 ответ
Даже этот пост очень старый, я хочу помочь решить эту проблему, потому что у меня было то же самое, и я решил это следующим образом:
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() только один раз, когда объект равен нулю. После этого я никогда не использую call graphics.GetHdc().