2

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

首先,我使用 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));
4

1 回答 1

3

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

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

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

于 2011-09-02T04:50:58.717 回答