当前位置: 首页 > 编程语言 > C#

捕获DirectX应用程序的视觉输出-即使在后台?Share

时间:2023-04-10 18:50:29 C#

捕获DirectX应用程序的视觉输出-即使在后台?我需要捕获DirectX窗口的视觉输出(如屏幕截图)。目前,我使用这种方法。然而,当窗口在背景中时,它会捕获前面的任何内容。我看到即使在最小化或在后台时也可以呈现DirectX窗口,所以这应该是可能的。但是怎么办?(它还需要快速,不幸的是它还需要在WindowsXP上运行......)编辑:这些天我很忙......别担心,如果赏金过期我会把它放回去。要在后台(或屏幕外)捕获Direct3D窗口,我相信您有以下选择:通过您发布的链接或这个较新的示例在目标应用程序中注入并挂接Direct3D(EasyHook可能很难设置,但它工作得很好)——你总是可以寻求帮助让它工作。我已经使用这种技术毫无问题地捕获了许多游戏(最近是流光溢彩克隆项目)。这种做法的问题是你担心游戏保护导致封禁,但是FRAP也使用hooks来实现这个,所以你的担心可能被夸大了?我猜游戏玩家被禁止截屏是一种昂贵的查找方式。对于Vista/Win7上的窗口应用程序-您可以注入和挂钩DWM,并通过其共享表面发出捕获请求。我已经让它在Vista上运行,但还没有让它在Windows7上运行,这里是Windows7的示例http://www.youtube.com/watch?v=G75WKeXqXkc。这种方法的主要问题是它使用未记录的API,这可能意味着当Windows补丁发布时您的应用程序会在没有警告的情况下中断-您还必须为Windows的每个新的主要版本重做该技术。这也不会执行您需要在WindowsXP中捕获的内容。同样在DWM中,有一个缩略图API。根据您要执行的操作,这有局限性。有关此API以及其他DWMAPI的一些信息位于http://blogs.msdn.com/b/greg_schechter/archive/2006/09/14/753605.aspx还有其他技术可以在EasyHook的情况下无需拦截Direct3D调用即可使用,例如用包装器替换各种DLL。你会在这里找到各种其他游戏挂钩/拦截技术:http://www.gamedeception.net/只需将Direct3D应用程序带到前台(我认为这在你的情况下是不可取的)-除非你也移动了窗口,否则这不适用于屏幕外窗口。不幸的是,我能想到的唯一WindowsXP解决方案是以某种形式拦截Direct3DAPI。只是为了阐明最小化情况下的Direct3D渲染。在我对这个问题的相当有限的测试中,我发现这是依赖于应用程序的;通常不建议在应用程序最小化时进行渲染(又名此参考),但它会继续在后台渲染。更新:为第1点提供的更多最新注入示例的附加链接。快速谷歌搜索,我发现这个代码项目与WindowsXP相关。不知您是否可以将这些知识应用到WindowsVista和7中?http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen编辑:我还发现这篇文章:http://www.codeproject.com/Articles/20651/Capturing-Minimized-Window-A-Kid-s-Trick这链接到评论中Justins的博客文章。他似乎在和某人一起工作(我看到了你的链接)。C#-使用Direct3D的屏幕捕获您链接到的代码(来自spazzarama),您说您在项目中使用它,捕获DirectX设备的前端缓冲区。您是否尝试过捕获后备缓冲区?从链接站点上的代码开始,您将更改第90行device.GetFrontBufferData(0,surface);到Surfacebackbuffer=device.GetBackBuffer(0,0,BackBufferType.Mono);SurfaceLoader.Save("屏幕截图.bmp",ImageFileFormat.Bmp,后台缓冲区);这还涉及删除链接示例中的第96-98行。可以在不阻塞窗口的情况下生成后备缓冲区。编辑没关系这一切。我刚刚意识到您链接的示例代码正在使用窗口句柄来定义屏幕区域,而不是实际使用DirectX窗口进行任何操作。您的示例代码无法绕过障碍,因为当您访问它时,您的区域已经绘制在它前面的另一个窗口中。挽救该应用程序的最佳方法可能是在运行代码以捕获图像之前将DirectX窗口置于屏幕顶部。您可以使用Wind32APIBringWindowToTop函数来执行此操作(http://msdn.microsoft.com/en-us/library/ms632673%28VS.85%29.aspx)。以上是C#学习教程:CapturingthevisualoutputofaDirectXapplication-Eveninthebackground?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: