我最近制作了一个截取游戏截图的应用程序。
首先我使用GDI来捕获游戏,但为此我必须在win7 / vis上禁用aero,我在Windows XP上遇到了一些问题。
我决定使用DirectX并且在意识到微软的DX不适合我之后,我发现了SlimDX屏幕截图的一个很好的例子(http://spazzarama.wordpress.com/2009/02/07 /抓屏与 - 的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));
答案 0 :(得分:3)
当Direct3D设备进入全屏模式时,它被授予对视频卡的独占访问权限。来自the MSDN documentation:
当Direct3D对象采用独占模式时,除全屏之外的所有设备都将处于丢失状态。
我不认为有任何方法可以让您的技术在进入全屏独占模式后获取另一个应用程序的屏幕截图。我的理解是,检索全屏表面状态的其他应用程序(即视频记录程序等)通过将它们自己的代码注入Direct3D库本身来实现。这是一项非平凡的努力;你可以尝试搜索“directx code injection”或者类似的东西,如果你有兴趣沿着这条路前进。