c++ - 在远程桌面中创建 DirectX 设备失败

标签 c++ winapi directx rdp

我有一个使用 DirectX 捕获屏幕的应用程序。该应用程序在本地运行良好,但是当我通过远程桌面 session 运行它时,IDirect3D9::CreateDevice 函数失败:

    d3dpp.Windowed=WINDOW_MODE;
    d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    d3dpp.BackBufferFormat=ddm.Format;
    d3dpp.BackBufferHeight=nDisplayHeight=gScreenRect.bottom =ddm.Height;
    d3dpp.BackBufferWidth=nDisplayWidth=gScreenRect.right =ddm.Width;
    d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow=hWnd;
    d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
    d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;

    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dpp,&g_pd3dDevice)))
    {
        ErrorMessage("Unable to Create Device");
        return E_FAIL;
    }

我正在使用 Windows 7 通过 RDP 访问 Windows Server 2008 R2。

这里到底出了什么问题?我读到可以通过 RDP 使用 Direct3D。

最佳答案

我不知道失败的确切原因,但我可以给你一个方向。 当您通过 RDP 连接时,Windows 根本不会加载您的 native 视频驱动程序,并且显示器上实际上没有显示任何内容。相反,系统加载 RDPDD 虚拟视频驱动程序,该驱动程序绘制系统内存中的所有内容,并通过网络将其发送到 RDP 客户端。这就是远程桌面的工作原理。

这样你的本地视频卡/驱动程序就完全不参与了。 RDPDD 是一个非常简单的“帧缓冲区”驱动程序,它根本不支持 Direct3D/DirectDraw。

OTOH 你用 D3DDEVTYPE_REF 参数调用 CreateDevice,即使你没有兼容 D3D 的视频卡,它也应该可以工作,D3D 应该在软件中模拟。因此 - 我不知道为什么会这样。我可以猜测问题可能出在 D3DPRESENT_PARAMETERS 参数中。也许其中一些可能无法模拟。

尝试检查错误代码,使用 D3DPRESENT_PARAMETERS 播放。

关于c++ - 在远程桌面中创建 DirectX 设备失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8121276/

相关文章:

c++ - 构造函数主体前的冒号是否表示继承

delphi - Windows ETW : Kernel consumer receives no EventCallback or BufferCallback events

c# - 如何在 .NET 3.5 中获取 CSIDL_COMMON_DOCUMENTS 的路径?

c++ - 什么时候释放传递给 DirectX 的内存是安全的?

c++ - 在 Optimus 笔记本电脑中以编程方式强制使用 NVIDIA GPU

c++ - 有没有办法在 Visual C++ 中编写带有变量参数列表的宏?

c++ - 带有gcc 7.4.0的奇怪std::atof错误

c++ - 用于广告牌的 D3DXSPRITE 的 3d 替代方案

c++ - 通常使用什么方法来检测时间情况?

c# - 获取无边框的进程窗口大小