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

Using d3d9's backbuffer functionalities correctly

本文关键字:后台 缓冲 功能 d3d9      更新时间:2023-10-16

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

该程序使用DLL调用给我它的窗口句柄。

根据返回的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();

我的帧向量仍然为空。也许问题来自多重采样?我不完全理解它是如何工作的,只是我使用的是d3dpp.MultiSampleType=D3DMULTISAMPE_NONE;在我的D3DPRESENT_PARAMETERS中。

为现有窗口创建D3D设备不允许捕获其内容,即使该窗口是使用硬件加速渲染的。如果窗口已经有一个D3D设备,那么创建该设备的API调用应该失败(iirc)。如果窗口被绘制为使用常规的Windows API(即GDI),D3D内容将根据Windows版本与其他内容组成,或者以未定义的方式表现。这样的组合将在访问后台缓冲区后发生,并且(很可能)在其他地方发生。