C# 使用 SlimDX 捕获全屏游戏

标签 c# directx screenshot slimdx

我最近制作了一个可以截取游戏屏幕截图的应用程序。

首先,我使用 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:设备丢失 (-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));

最佳答案

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

when a Direct3D object assumes exclusive mode, all devices other than the one that went full-screen are placed in lost state.

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

关于C# 使用 SlimDX 捕获全屏游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7278944/

相关文章:

ios - 如果应用程序在后台运行,如何以编程方式截取屏幕截图

java - 将子对象分配给基础是可能的,但如果对集合执行相同的操作,则不可能

delphi - Delphi 中的游戏开发

directx - HLSL 中的渲染深度

c++ - 保存 wxWidgets 窗口截图

testing - 屏幕录像机工具 - 开源/与测试管理集成

c# - 从多个线程填充列表

c# - ICollection<T>.Any(Func<T, bool>) 的表达式

c# - 在 wpf 中安排应用程序操作

c++ - 使用矩阵、欧拉角和/或四元数进行旋转表示的优缺点是什么?