gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:43:43 24 4
gpt4 key购买 nike

我正在尝试编写一个简单的 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();

我的框架 vector 仍然是空的。也许问题来自多重采样?我不完全明白它是如何工作的,除了我使用的是 d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;在我的 D3DPRESENT_PARAMETERS 中。

最佳答案

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

关于c++ - 正确使用 d3d9 的后台缓冲功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26799697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com