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

时间:2012-01-20 16:15:35

标签: c# .net windows-7 screenshot

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

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);

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

机器#1,它采用了WoW图片,运行64位Win7 Professional并安装了.NET Framework版本2.0到4.0。

机器#2,它采用桌面图片,运行安装了.NET Framework版本1.0到4.0的32位Win7 Home Premium SP1。

编辑添加:另一个数据点是,如果我将机器#2从Win7 Aero桌面主题切换为“经典”主题,我会开始获取WoW图片而不是桌面图片。

1 个答案:

答案 0 :(得分:1)

我添加了一个电话:

DwmEnableComposition(DWM_EC_DISABLECOMPOSITION); 

根据Enabling/Disabling Aero from a Windows Service的答案,并解决了问题。但是,我真的不明白为什么。