如何使用DX9获取其他全屏游戏的屏幕截图



我现在正在尝试创建一个屏幕捕获程序。上周我尝试了GetFrontBufferData方法,它成功了。然而,它的性能很糟糕,只能捕捉到桌面图像。这意味着当我开始运行全屏游戏时,GetFrontBufferData方法将一无所获。但我想要的是捕捉全屏游戏,而不是桌面图像。

在GetFrontBufferData解决方案中,我创建了一个设备,并让HWND参数为NULL。我想知道我是否可以获得顶级窗口的句柄(即全屏游戏的句柄),并将其传递给CreateDevice方法,我可以捕捉到它的屏幕截图。

实际上,我已经尝试了几种基于DX9的屏幕捕捉方法。我研究了屏幕捕捉的最快方法,并尝试了将GetRenderTarget()方法与GetRenderTargetData()结合使用。问题是我只能获得程序本身渲染的渲染数据。GetBackBuffer()也是如此。

所以问题来了,如果我能得到顶层窗口的句柄,我能得到一个特定的窗口图像吗(比如一些正在运行的全屏游戏)?我已经检查了应用程序的Win32-Get-Main-Wnd Handle中描述的EnumWindow方法。根据我的测试,这段代码似乎得到了只有程序自己创建的窗口。然而,我需要得到一些由其他程序创建的窗口。

所以,这就是我的问题。总之,我想知道两件事:1,我的方法是获得其他窗口的句柄,然后将其传递给CreateDevice并获得正确的屏幕截图吗?2、如果是正确的,如何获得手柄;如果这是错误的,那么捕捉全屏游戏的正确方法是什么?

  1. 这是不对的,传递给CreateDevice的窗口句柄与屏幕捕获无关,它是在应用程序进入后台时提醒Direct3D的窗口。因为你想从另一个应用程序捕获屏幕数据流,所以这里的窗口句柄对你没有帮助。

  2. 由于性能至关重要,而GetFrontBufferData非常耗时,所以我认为唯一适合您需求的方法是挂接Direct3D,中断对Present的调用,并从backbuffer获取数据,然后您可以随心所欲,这只是一个想法,我不熟悉挂接,以前从未挂接过Direc3D。

以下是CreateDevice中使用的两个窗口句柄(来自DirectX SDK文档)

创建Direct3D设备时,提供两个不同的窗口参数:焦点窗口(hFocusWindow)和设备窗口(D3DPRESENT_PARAMETERS中的hDeviceWindow)。每个窗口的用途是:当应用程序从前台模式到后台模式(通过Alt Tab键、鼠标单击或一些其他方法)。每个设备共享一个焦点窗口由应用程序创建。设备窗口确定位置以及屏幕上后台缓冲区的大小。Direct3D在在期间,后缓冲区内容被复制到前缓冲区

出席。

最新更新