为什么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桌面主题切换到"经典"主题,我会开始获得魔兽世界图片,而不是桌面图片。
我添加了对的调用
DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);
根据从Windows服务启用/禁用Aero的答案,并修复了问题。然而,我真的不明白为什么。