You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:57:17