为什么CopyFromScreen在不同的机器上为全屏游戏提供不同的结果

本文关键字:游戏 结果 CopyFromScreen 机器 为什么 | 更新日期: 2023-09-27 18:20:51

我正在使用下面的代码来获取所有活动显示组合的屏幕截图。

Rectangle totalSize = Rectangle.Empty;
foreach (Screen s in Screen.AllScreens)
    totalSize = Rectangle.Union(totalSize, s.Bounds);
Bitmap screenShotBMP = new Bitmap(
    totalSize.Width, totalSize.Height,
    PixelFormat.Format32bppArgb);
Graphics screenShotGraphics = Graphics.FromImage(
    screenShotBMP);
screenShotGraphics.CopyFromScreen(
    totalSize.Location.X,
    totalSize.Location.Y,
    0, 0, totalSize.Size,
    CopyPixelOperation.SourceCopy);

到目前为止,我已经在两台不同的机器上测试过了,当魔兽世界运行全屏时,一台机器拍摄魔兽世界屏幕的照片,另一台拍摄桌面的照片。如果这段代码从未用于拍摄魔兽世界的屏幕截图,我不会感到惊讶,因为(我认为)它使用DirectX直接写入视频卡。然而,由于确实在一种情况下有效,我想知道是否可以在代码和/或机器配置中进行更改,以使其在所有情况下都有效。(至少对魔兽世界来说。我意识到可能还有很多其他游戏不起作用。)这似乎不是框架版本的问题,因为我已经针对不同的版本编译了代码,行为没有改变。

拍摄魔兽世界图片的机器#1运行64位Win7 Professional,并安装了.NET Framework 2.0至4.0版本。

拍摄桌面图片的机器#2正在运行32位Win7 Home Premium SP1,并安装了.NET Framework 1.0到4.0版本。

编辑添加:另一个数据点是,如果我将机器#2从Win7 Aero桌面主题切换到"经典"主题,我会开始获得魔兽世界图片,而不是桌面图片。

为什么CopyFromScreen在不同的机器上为全屏游戏提供不同的结果

我添加了对的调用

DwmEnableComposition(DWM_EC_DISABLECOMPOSITION); 

根据从Windows服务启用/禁用Aero的答案,并修复了问题。然而,我真的不明白为什么。