0

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

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

其实我已经尝试了几种基于DX9的截屏方法。我研究了最快的屏幕捕获方法问题,并尝试了 GetRenderTarget() 方法和 GetRenderTargetData()。问题是我只能获取程序本身渲染的渲染数据。GetBackBuffer() 也一样。

那么问题来了,如果我能得到顶层窗口的句柄,我能得到一个特定的窗口图像(比如一些正在运行的全屏游戏)吗?我检查了Win32-Get Main Wnd Handle of application中描述的 EnumWindow 方法。根据我的测试,这段代码似乎得到了仅由它自己创建的程序的窗口。但是我需要获取其他程序创建的一些窗口。

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

4

1 回答 1

0
  1. 不对,传递给 CreateDevice 的窗口句柄与截屏无关,它是当应用程序进入后台时提醒 Direct3D 的窗口。由于您想从另一个应用程序捕获屏幕数据流,所以这里的窗口句柄无法帮助您。

  2. 由于性能很关键,而且 GetFrontBufferData 很耗时,所以我认为满足您需求的唯一方法是 Hooking Direct3D,中断对 Present 的调用,并从 backbuffer 中获取数据,然后您就可以为所欲为,这只是一个想法,我不熟悉挂钩,我以前从未挂钩 Direc3D。

这是关于 CreateDevice 中使用的两个窗口句柄的一些信息(来自 DirectX SDK 文档)

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

展示。

于 2013-07-26T09:07:11.703 回答