【问题标题】:C# Capturing A Fullscreen Game With SlimDXC# 使用 SlimDX 捕获全屏游戏
【发布时间】:2011-09-02 03:26:33
【问题描述】:

我最近做了一个游戏截图的应用程序。

首先我使用 GDI 来捕获游戏,但为此我不得不在 win7/vis 下禁用 aero,而且我在 windows XP 上遇到了一些问题。

我决定使用 DirectX,在意识到微软的 DX 对我不起作用后,我发现了这个 SlimDX 屏幕截图的绝佳示例 (http://spazzarama.wordpress.com/2009/02/07 /screencapture-with-direct3d/)

SlimDX 效果很好!它甚至让我无需在 win7/vis 上禁用 aero 即可捕获游戏。

唯一的问题是 - 当我将游戏切换到全屏时,我得到“D3DERR_DEVICELOST: Device lost (-2005530520)”。

谁能建议一种方法来自定义代码以便捕获全屏应用程序?

注意:我已经有一个方法可以确定游戏是全屏还是窗口。

我改变了这一行:

bitmap = new Bitmap(SlimDX.Direct3D9.Surface.ToStream(surface, SlimDX.Direct3D9.ImageFileFormat.Bmp, new Rectangle(region.Left, region.Top, region.Width, region.Height)));

到这个:

bitmap = new Bitmap(SlimDX.Direct3D9.Surface.ToStream(surface, SlimDX.Direct3D9.ImageFileFormat.Bmp));

【问题讨论】:

  • DirectX 不起作用,但 SlimDX 可以吗?这似乎很奇怪,因为 SlimDX 是 DirectX。当您考虑发布的 sn-ps 时,它将表面的一部分简单地保存到内存中,我相信您错了。如果您可以访问后台缓冲区,对于 D3D 上下文或屏幕,“Microsoft's DX”中的等效代码也将起作用。
  • 并不是说它不起作用,而是我遇到了一些问题。应用程序在执行代码之前冻结。

标签: c# directx screenshot slimdx


【解决方案1】:

当 Direct3D 设备进入全屏模式时,它被授予对视频卡的独占访问权限。来自the MSDN documentation

当 Direct3D 对象采用独占模式时,除全屏显示的设备之外的所有设备都处于丢失状态。

我认为没有任何方法可以让您的技术在另一个应用程序进入全屏独占模式后对其进行截图。我的理解是,其他检索全屏表面状态的应用程序(即视频录制程序等)是通过将自己的代码注入 Direct3D 库本身来实现的。这是一项不平凡的努力;如果您有兴趣走这条路,可以尝试搜索“directx 代码注入”或类似内容。

【讨论】:

  • 我不会说不重要,它是一个简单的函数和非常基本的包装器相结合。让它做有趣的事情并与特定的应用程序一起工作会更有趣,但通常并不难。
  • 说任何事情都是“不平凡的”当然是基于我对相关人员的背景和经验的估计。这不是不可能做到的,对于有必要经验的人来说可能甚至不难,但这肯定不是用半打 C# 代码就能完成的事情,而且对于没有使用本机经验的人来说,这不会是显而易见的代码库。如果你想总结一下如何完成这样的事情,我会和任何人一样有兴趣阅读它。
猜你喜欢
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多