【问题标题】:Why does CopyFromScreen give different results for full-screen game on different machines?为什么 CopyFromScreen 在不同的机器上对全屏游戏给出不同的结果?
【发布时间】:2012-01-21 03:11:34
【问题描述】:

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

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 直接写入视频卡。但是,由于它确实在一种情况下工作,我想知道我是否可以在代码和/或机器配置中进行更改以使其在所有情况下都能正常工作。 (至少对于魔兽世界。我意识到可能还有很多其他游戏无法运行。)这似乎不是框架版本问题,因为我已经针对不同版本编译了我的代码并且行为没有改变.

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

获取桌面图片的机器 #2 运行 32 位 Win7 Home Premium SP1,并安装了 .NET Framework 1.0 至 4.0 版本。

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

【问题讨论】:

  • 会不会是wow本身在两台机器上有不同的配置,比如视频设置?
  • 我刚查了一下,两台机器上的魔兽世界都是32位的应用程序。会不会是因为程序运行在 32 位子系统中,所以 64 位 CLR 能够捕捉到它的视频?
  • 我认为只有在安装了合适的图形加速器和驱动程序并且游戏全屏运行时,游戏才会直接写入视频内存。
  • 两个 WoW 安装的视频设置相同。

标签: c# .net windows-7 screenshot


【解决方案1】:

我添加了一个调用:

DwmEnableComposition(DWM_EC_DISABLECOMPOSITION); 

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

【讨论】:

    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 2011-01-21
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多