我正在使用下面的代码截取所有活动显示组合的屏幕截图。
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图片而不是桌面图片。
答案 0 :(得分:1)
我添加了一个电话:
DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);
根据Enabling/Disabling Aero from a Windows Service的答案,并解决了问题。但是,我真的不明白为什么。