我最近做了一个可以截取游戏截图的应用程序。
首先,我使用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));发布于 2011-09-02 12:50:59
当Direct3D设备进入全屏模式时,它被授予对视频卡的独占访问权限。来自the MSDN documentation:
当Direct3D对象采用独占模式时,除全屏设备外的所有设备都将置于丢失状态。
我不认为有任何方法可以让你的技术在另一个应用程序进入全屏独占模式后截屏。我的理解是,其他检索全屏表面状态的应用程序(即视频录制程序等)是通过将自己的代码注入到Direct3D库中来实现的。这是一项非常重要的工作;如果您对此感兴趣,可以尝试搜索"directx代码注入“或类似的内容。
https://stackoverflow.com/questions/7278944
复制相似问题