2011-09-02 58 views
2

我最近做了一个截取游戏截图的应用程序。C#利用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)); 
+0

DirectX不工作,但SlimDX呢?这似乎很奇怪,因为SlimDX是DirectX。当你考虑你发布的片段时,我认为你错了。如果您可以访问后台缓存,对于D3D上下文或屏幕,“Microsoft's DX”中的等效代码也可以使用。 – ssube

+0

不是说它没有工作,我有一些问题。应用程序在执行代码之前冻结。 – user779444

回答

3

当Direct3D设备进入全屏模式,它授予显卡独占访问。从the MSDN documentation

当Direct3D对象假定为独占模式时,除全屏设备以外的所有设备均处于丢失状态。

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

+0

我不会说不平凡的,它是一个简单的功能和非常基本的包装组合。让它做有趣的事情并与特定的应用程序一起工作会更有趣,但通常不难。 – ssube

+0

当然,任何事情都是“不平凡的”,这是基于我对所涉人员的背景和经验的估计。这不是不可能,对于具有必要经验的人来说甚至可能不会那么困难,但是这绝对不是一个可以在六行C#代码中完成的事情,对于没有经验与本地工作经验的人来说,这是不明显的代码库。如果你想写一个总结如何完成这样的事情,我会对任何人都有兴趣阅读它。 –