Windows10虚拟机远程桌面最小化时GetDeviceCaps调用失败求助
远程桌面最小化时Direct3D9 GetDeviceCaps返回D3DERR_NOTAVAILABLE的原因
核心原因
这是Windows远程桌面的会话资源管理机制导致的:
- 当远程桌面处于窗口或全屏模式时,虚拟机的NVIDIA RTX3090 GPU会被分配给当前远程会话,Direct3D可以正常访问硬件加速层(HAL,对应
D3DDEVTYPE_HAL),因此GetDeviceCaps调用成功。 - 当远程桌面最小化后,Windows会判定该远程会话处于“无可见输出”状态,为了优化资源占用,会暂停该会话的硬件加速渲染上下文,回收GPU资源。此时Direct3D无法再访问HAL类型的设备,调用
GetDeviceCaps请求D3DDEVTYPE_HAL就会返回D3DERR_NOTAVAILABLE。
验证方式
如果将代码中的D3DDEVTYPE_HAL替换为D3DDEVTYPE_REF(软件渲染设备),即使远程桌面最小化,GetDeviceCaps也能正常返回结果——因为软件渲染不依赖GPU硬件资源,不受会话窗口状态的影响。
示例代码
#include <Windows.h> #include <d3d9.h> #include <stdio.h> int main() { // sleep 5 seconds and manually minimize the remote desktop window immediately after the sleep operation Sleep(5000); IDirect3D9* pD3d9 = nullptr; pD3d9 = Direct3DCreate9(D3D9b_SDK_VERSION); UINT adapters = pD3d9->GetAdapterCount(); for (UINT i = 0; i < adapters; i++) { D3DCAPS9 caps = {}; HRESULT res = pD3d9->GetDeviceCaps(i, D3DDEVTYPE_HAL, &caps); if (FAILED(res)) { printf("Call GetDeviceCaps Failed:%x\n", res); break; } } pD3d9->Release(); return 0; }
内容的提问来源于stack exchange,提问作者Chen Chen
相关产品推荐
相关产品推荐

