Graphics.CopyFromScreen возвращает черный экран - PullRequest
0 голосов
/ 18 мая 2009

У меня есть небольшое приложение, которое делает снимки экрана и сохраняет их в папке, в которой оно находится. В большинстве случаев работает нормально, но в некоторых случаях, например, в Team Fortress 2 или во время работы Warcraft 3 в режиме OpenGL, просто возвращает полностью черное (или белое) изображение. У кого-нибудь есть способ это исправить?

Я использую стандарт c #:

Bitmap bmp;
Graphics gfx;
bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
gfx = Graphics.FromImage(bmpScreenshot);
gfx.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
bmpScreenshot.Save("image.jpg", ImageFormat.Jpeg);

Ответы [ 3 ]

2 голосов
/ 18 мая 2009

Функции скриншотов Windows не копируют данные с поверхностей DirectX. Вы должны сделать это вручную, как описано в этой статье .

1 голос
/ 18 мая 2009

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

Панель управления -> Свойства экрана -> Настройки -> Дополнительно -> Устранение неполадок

Я думаю, что есть возможность уменьшить аппаратное ускорение, которое должно позволить вам захватить их.

Я знаю, что должен был сделать это, чтобы получить скриншоты из видео, надеюсь, это поможет вам с opengl.

0 голосов
/ 18 мая 2009

Вы предполагаете, что экран находится в PixelFormat.Format32bppArgb, это может не всегда иметь место, хотя я не знаю, будет ли это уместно, учитывая другие ответы.

Если это уместно, вы можете попробовать Screen.PrimaryScreen.BitsPerPixel, чтобы получить глубину экрана. Я не пробовал, поэтому не знаю, сработает ли это или нет.

...