正确使用d3d9的后备缓冲功能

时间:2014-11-07 10:56:51

标签: c++ directx

我正在尝试编写一个简单的DLL,它允许我截取调用它的程序的截图。

程序使用DL​​L调用给我一个Window Handle。

根据返回的HRESULT值,CreateDevice函数CreateOffScreenPlainSurface可以使用提供的句柄正常工作。

但是输出图像是空白的,那么我认为我没有正确使用DirectX的GetBackBuffer函数。

以下是我的工作方式:

HRESULT GFBD_r = g_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface);
HRESULT LR_r = pSurface->LockRect(&lr, &rect, D3DLOCK_READONLY);
memcpy(&Frame[0], lr.pBits, Width*Height*4);
pSurface->UnlockRect();

我的帧矢量仍然是空的。也许问题来自Multisampling?我不完全理解它是如何工作的,除了我正在使用d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;在我的D3DPRESENT_PARAMETERS。

1 个答案:

答案 0 :(得分:0)

为现有窗口创建D3D设备不允许捕获其内容,即使该窗口使用硬件加速进行渲染也是如此。如果窗口已有D3D设备,则创建设备的API调用将失败(iirc)。如果使用常规Windows API(即GDI)绘制窗口,则D3D内容将根据Windows版本与其他内容组合或以未定义的方式运行。 访问后台缓冲区之后,(可能)在其他地方发生此类组合。