我现在正在尝试创建一个屏幕捕获程序。上周我尝试了 GetFrontBufferData 方法,它成功了。但是,它的性能很糟糕,只能捕捉桌面图像。这意味着当我开始运行全屏游戏时,GetFrontBufferData 方法将一无所获。但我想要的是捕捉全屏游戏而不是桌面图像。
在 GetFrontBufferData 解决方案中,我创建了一个设备并让 HWND 参数为 NULL。我想知道我是否可以获得顶层窗口的句柄(意思是全屏游戏的句柄),并将其传递给 CreateDevice 方法,我可以捕捉到它的屏幕截图。
其实我已经尝试了几种基于DX9的截屏方法。我研究了最快的屏幕捕获方法问题,并尝试了 GetRenderTarget() 方法和 GetRenderTargetData()。问题是我只能获取程序本身渲染的渲染数据。GetBackBuffer() 也一样。
那么问题来了,如果我能得到顶层窗口的句柄,我能得到一个特定的窗口图像(比如一些正在运行的全屏游戏)吗?我检查了Win32-Get Main Wnd Handle of application中描述的 EnumWindow 方法。根据我的测试,这段代码似乎得到了仅由它自己创建的程序的窗口。但是我需要获取其他程序创建的一些窗口。
所以,这是我的问题。总之,我想知道两件事:1,我的方法是获取其他窗口的句柄然后将其传递给 CreateDevice 并获取其屏幕截图吗?2、如果是对的,手柄怎么弄;如果是错误的,捕获全屏游戏的正确方法是什么?