C# Graphics.CopyFromScreen返回黑屏

C# Graphics.CopyFromScreen返回黑屏,c#,.net,screenshot,C#,.net,Screenshot,我有一个小应用程序,它可以拍摄屏幕截图并将其保存到它的文件夹中。它在大多数情况下工作正常,但在某些情况下,例如在TeamFortress 2中或在OpenGL模式下运行魔兽争霸3时,它只返回一个完全黑色(或白色)的图像。有人有办法解决这个问题吗 我使用的是c#标准: Bitmap bmp; Graphics gfx; bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Pi

我有一个小应用程序,它可以拍摄屏幕截图并将其保存到它的文件夹中。它在大多数情况下工作正常,但在某些情况下,例如在TeamFortress 2中或在OpenGL模式下运行魔兽争霸3时,它只返回一个完全黑色(或白色)的图像。有人有办法解决这个问题吗

我使用的是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);

您假设屏幕为
PixelFormat.Format32bppArgb
这种情况可能并不总是如此,尽管我不知道这是否与其他答案相关


如果相关,您可以尝试
Screen.PrimaryScreen.BitsPerPixel
获取屏幕的深度。我没有尝试过,所以我不知道它是否有效。

您假设屏幕为
像素格式。Format32bppArgb
可能并不总是这样,尽管我不知道这是否与其他答案相关


如果相关,您可以尝试
Screen.PrimaryScreen.BitsPerPixel
获取屏幕的深度。我还没有试过,所以我不知道它是否有效。

我理解这是因为这些类型的图形被您的图形卡覆盖了。这也是为什么你可能无法抓取屏幕上显示视频的部分

控制面板-->显示属性-->设置-->高级-->疑难解答

我认为有一个选项可以减少硬件加速,这应该可以让你抓住它们


我知道我必须这样做是为了从视频中抓取屏幕截图,希望这对你的opengl有帮助。

我理解这是因为这些类型的图形被你的图形卡覆盖了。这也是为什么你可能无法抓取屏幕上显示视频的部分

控制面板-->显示属性-->设置-->高级-->疑难解答

我认为有一个选项可以减少硬件加速,这应该可以让你抓住它们


我知道我必须这样做是为了从视频中抓取屏幕截图,希望这对opengl有帮助。

Windows屏幕截图功能不会从DirectX表面复制数据。您必须按照所述手动执行此操作。

Windows屏幕截图功能不会从DirectX曲面复制数据。你必须像上面描述的那样手动操作。

OP提到他在OpenGL中运行。OP提到他在OpenGL中运行。但是,在标准模式下运行魔兽争霸3时,屏幕截图被完美捕捉。我假设它是DirectX。但是,在标准模式下运行魔兽争霸3时,屏幕截图被完美捕捉。我猜是DirectX。