ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Parsec VDD 虚拟显示驱动完全指南:从驱动安装到 C/C++ 核心 API 集成

Parsec VDD 虚拟显示驱动完全指南:从驱动安装到 C/C++ 核心 API 集成 桌面应用驱动开发【免费下载链接】parsec-vdd✨ Perfect virtual display for game streaming项目地址https://gitcode.com/gh_mirrors/pa/parsec-vdd点击查看免费下载Parsec VDDVirtual Display Driver是一套基于 Windows 间接显示驱动IddCx协议、可脱离 Parsec 客户端独立使用的虚拟显示器方案。本文以仓库根目录的 README.md 为主线结合 core/parsec-vdd.h、core/vdd-demo.cc 以及 C# 应用侧的 app/Vdd/Core.cs、app/CLI.cs 源码完整讲解驱动安装、核心 API 的调用方式、keep-alive 心跳机制、已知限制与常见问题排查。读完本文你将掌握如何在 Windows 10 主机上独立创建、管理、移除最多 16 个虚拟显示器并把这一能力集成进自己的 C/C 或 C# 项目中。项目概览让虚拟显示器脱离 Parsec 客户端独立运行Parsec VDD 是 Parsec 公司基于 WindowsIddCx APIIndirect Display Driver间接显示驱动构建的虚拟显示方案。在官方产品中它属于 Parsec Teams 与 Warp 客户可用的功能允许向主机添加最多 3 个虚拟显示器适用于物理显示器缺失或需要扩展显示的场景。而本仓库的核心价值在于它提供了一套独立于 Parsec 应用本身的解决方案让任何开发者都能通过一套精简的 API 直接驱动该虚拟显示驱动在 Windows 10 系统上自由创建高分辨率、高刷新率的虚拟显示器最高可达 4K、240 Hz。仓库的组成结构清晰核心 C/C 单头文件库core/parsec-vdd.h仅一个头文件即可接入任意 C/C 项目演示程序core/vdd-demo.cc按键即可添加/移除虚拟显示器的交互式示例桌面管理应用 ParsecDisplay基于 C# 与 WPF 构建见 app/提供托盘界面来增删虚拟显示器、调整分辨率/刷新率/方向、截图等命令行工具由 ParsecDisplay 应用附带分发vdd命令详细用法见 docs/VDD_CLI_USAGE.md。典型使用场景README 列举了虚拟显示器在实际工作中的几类典型应用几乎覆盖了游戏串流与远程桌面生态的全部痛点游戏串流配合 Parsec、Sunshine/Moonlight、Steam Remote Play 使用。宿主机可直接按串流目标的分辨率与刷新率输出不再受物理显示器规格限制无头主机与云虚拟机无显示器接入的 Windows 机器构建服务器、游戏虚拟机、云 GPU 实例可通过 VDD 获得真实桌面会话让拒绝在无显示器环境下运行的采集工具、启动器与基准测试正常工作AR / XR 工作空间向 AR 眼镜或头戴式显示器项目如 Verto_XR提供多个虚拟显示器作为输入源多显示器生产力不依赖扩展坞即可扩展笔记本显示或在购买物理屏幕前预览/测试多屏布局Hyper-V / GPU-PV 虚拟机虚拟机内置的 Hyper-V 显示器无法断开会阻止 Parsec/Sunshine 回退到自带的虚拟显示器在虚拟机内加装 VDD 可提供一个可控的串流目标高刷新率采集与录制按编码器所需的精确分辨率与刷新率录制如 1080p240Hz、4K120Hz无需从物理显示器的原生模式裁剪或缩放隐私模式为远程会话配对虚拟显示器、本地使用物理显示器让两套桌面保持独立。ParsecDisplay 桌面应用ParsecDisplay 是面向 Parsec VDD 的虚拟显示器管理器以 C# WPF 实现工程文件见 app/ParsecDisplay.csproj。它提供基于托盘的交互界面可以添加/移除虚拟显示器修改分辨率、刷新率与屏幕方向捕获屏幕截图通过命令行接口vdd完成批量脚本化操作。从源码结构看app/MainWindow.xaml.cs、app/CLI.cs应用内部通过 app/Vdd/Controller.cs 常驻两条后台线程管理驱动会话UpdateLoop以 100 ms 周期发送 keep-alive 心跳StatusLoop每 2 秒轮询驱动状态并在设备就绪时自动重开设备句柄——这套模式与下文核心 API 的心跳保活机制完全对应。核心 API 使用指南README 的Using Core API章节是本项目最重要的开发文档核心 API 被设计为单个 C/C 头文件可直接加入任意项目core/parsec-vdd.h并附带一个可直接运行的演示程序 core/vdd-demo.cc。设计要点你必须先理解的四条铁律在动笔写代码前README 明确给出了四条与驱动交互的设计约束会话驱动Parsec VDD 面向 Parsec 客户端连接会话设计。用户连接主机后应用开始控制驱动——发送 IO 控制码IOCTL并接收结果索引即句柄添加虚拟显示器会返回一个索引index后续移除时需要使用它每个适配器最多可添加 16 个显示器从源码看core/parsec-vdd.h 出于避免插拔延迟的考虑将VDD_MAX_DISPLAYS保守地设为 8心跳保活驱动必须被周期性 ping否则约 1 秒后所有已添加的显示器会被全部拔出。这是驱动内置的看门狗机制用于清理崩溃宿主进程留下的残留状态改模式走 Win32 API没有直接操控已添加显示器的途径必须调用 Win32 Display API 来改变其显示模式可参考 ParsecDisplay 源码实现。README 用一张 mermaid 图概括了整体架构核心 API 速查常量与 IOCTL头文件 core/parsec-vdd.h 中定义了与设备身份相关的全部常量常量值说明VDD_DISPLAY_IDPSCCDD0显示器设备 ID可见于HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAYVDD_DISPLAY_NAMEParsecVDA显示器名称可见于高级显示设置VDD_ADAPTER_GUID{00b41627-04c4-429e-a26e-0265cf50c8fa}设备接口 GUID用于获取设备句柄VDD_ADAPTER_NAMEParsec Virtual Display Adapter适配器名称VDD_CLASS_GUID{4d36e968-e325-11ce-bfc1-08002be10318}设备类 GUIDDisplay 类VDD_HARDWARE_IDRoot\Parsec\VDA硬件 IDVDD_MAX_DISPLAYS8库层面的显示上限驱动实际支持 16驱动只暴露四个核心 IOCTLcore/parsec-vdd.h对应源码中的VddCtlCode枚举VDD_IOCTL_ADD 0x0022e004, // 添加显示器输出 4 字节索引 VDD_IOCTL_REMOVE 0x0022a008, // 移除显示器输入缓冲区 [1..4] 为索引 VDD_IOCTL_UPDATE 0x0022a00c, // 心跳 ping VDD_IOCTL_VERSION 0x0022e010, // 查询驱动小版本号基本用法检查状态 → 打开句柄 → 保活 → 增删显示器一个完整的接入流程如下对应 core/vdd-demo.cc 的main()结构第 1 步检查驱动状态。调用QueryDeviceStatus传入类 GUID 与硬件 ID。返回值是DeviceStatus枚举DEVICE_OK表示就绪其余值分别对应不可访问、未知问题、已禁用、驱动错误、需要重启、服务被禁用、未安装等完整枚举定义见 core/parsec-vdd.h。只有DEVICE_OK才能继续。DeviceStatus status QueryDeviceStatus(VDD_CLASS_GUID, VDD_HARDWARE_ID); if (status ! DEVICE_OK) { /* 按状态给出提示并退出 */ }第 2 步打开设备句柄。OpenDeviceHandle(VDD_ADAPTER_GUID)通过 SetupAPI 枚举设备接口并CreateFileW打开句柄。注意底层使用的打开标志FILE_FLAG_OVERLAPPED异步 IO配合FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING。HANDLE vdd OpenDeviceHandle(VDD_ADAPTER_GUID); if (vdd NULL || vdd INVALID_HANDLE_VALUE) { /* 失败处理 */ }第 3 步启动心跳线程。这是最重要的生命周期要求。演示程序用一个后台线程每 100 ms 调用一次VddUpdate(vdd)std::thread updater([running, vdd] { while (running) { VddUpdate(vdd); // IOCTL 0x22A00C std::this_thread::sleep_for(100ms); } });头文件注释明确要求应在线程中每隔不到 100 ms 调用一次VddUpdatecore/parsec-vdd.h。从协议层面看心跳间隔约 200 ms 是上限——若 ping 停止驱动会在约 1 秒后移除所有虚拟显示器详见 docs/PARSEC_VDD_RE.md 第 6 节对MM_keepalive_thread的分析。C# 侧完全复刻了这一模式app/Vdd/Controller.cs 的UpdateLoop以Thread.Sleep(100)为周期持续Core.Update(VddHandle)。第 4 步添加与移除显示器。int index VddAddDisplay(vdd); // 返回 0-15 的驱动索引 VddRemoveDisplay(vdd, index); // 按索引移除VddAddDisplay内部在发送VDD_IOCTL_ADD后会立即补发一次VddUpdatecore/parsec-vdd.h保证新显示器马上进入保活窗口。VddRemoveDisplay则把索引编码为16 位大端序后放入输入缓冲区((index 0xFF) 8) | ((index 8) 0xFF)core/parsec-vdd.h——这与 C# 侧 app/Vdd/Core.cs 中input[1] (byte)(index 0xFF)的写法等价都是以字节形式携带索引。第 5 步退出清理。遍历已添加的索引逐个VddRemoveDisplay随后CloseDeviceHandle(vdd)并退出心跳线程。IOCTL 调用的稳健性异步重叠 I/O 的正确姿势README 没有展开的底层细节在 docs/PARSEC_VDD_RE.md 第 3 节有完整的协议级参考所有 IOCTL 使用32 字节0x20零初始化输入缓冲区且设备句柄以FILE_FLAG_OVERLAPPED异步方式打开每次调用都携带OVERLAPPED结构并经GetOverlappedResultEx等待结果。这里有一个极易踩坑的关键点驱动可能返回FALSE且错误码不是ERROR_IO_PENDING却仍然排队执行该操作。因此稳健的模式是调用DeviceIoControl——忽略其同步返回值调用GetOverlappedResultEx(handle, ov, ..., timeout, FALSE)等待真实结果若等待失败超时/出错先CancelIoEx取消再阻塞式调用GetOverlappedResult(..., bWait TRUE)收尾。跳过第 3 步会让内核向已失效的栈帧写入数据导致同一线程的下一次调用发生访问冲突AV。C# 侧 app/Vdd/Core.cs 的IoControl方法完整实现了这一模式并附带了DumpErrorCode辅助方法把常见错误码ERROR_INVALID_HANDLE、ERROR_IO_PENDING转为可读文本可直接作为参考实现。演示程序一小时的交互式验证vdd-demo.cc 是验证驱动是否正常工作的最快途径程序启动后打印操作指南A添加显示器、R移除最后添加的显示器、Q退出并全部拔出。它包含VDD_MAX_DISPLAYS上限检查、_getch()交互循环以及退出前的完整清理逻辑是阅读核心 API 的最佳配套代码。更完整的 C/C API 逐函数参考参数、返回值、常量表见 docs/VDD_LIBRARY_USAGE.md协议级 IOCTL 格式、缓冲布局与设备生命周期SwDeviceCreate→SetupDiGetClassDevs→CreateFileW→ 添加显示器 → keep-alive → 断开清理见 docs/PARSEC_VDD_RE.md。安装驱动动手前的必要准备在创建任何虚拟显示器之前必须先安装驱动。README 给出了三个可用版本的选择建议按 OS 兼容性与稳定性取舍版本最低系统IddCx备注parsec-vdd-0.38Windows 10 16071.0已过时可能随机崩溃parsec-vdd-0.41Windows 10 19H21.4稳定parsec-vdd-0.45Windows 10 21H21.5串流色彩更好但部分 Windows 上可能不工作以上版本同样适用于 Windows Server 2019 及以上系统。安装包由 Parsec 官方构建服务发布安装包名为parsec-vdd-版本.exe。安装包可用 7z 解压得到驱动文件与nefconw命令行工具目录结构如下vdd-0.45/ |__ nefconw.exe |__ driver/ |__ mm.cat |__ mm.dll |__ mm.inf命令行安装需管理员权限使用nefconw手动创建设备节点并安装驱动start /wait .\nefconw.exe --remove-device-node --hardware-id Root\Parsec\VDA --class-guid 4D36E968-E325-11CE-BFC1-08002BE10318 start /wait .\nefconw.exe --create-device-node --class-name Display --class-guid 4D36E968-E325-11CE-BFC1-08002BE10318 --hardware-id Root\Parsec\VDA start /wait .\nefconw.exe --install-driver --inf-path .\driver\mm.inf顺序是先移除旧设备节点幂等清理再创建新的 Display 类设备节点硬件 ID 为Root\Parsec\VDA最后从mm.inf安装驱动。静默安装也可以直接以静默模式运行驱动安装包快速完成安装.\parsec-vdd-0.45.0.0.exe /S安装完成后即可用QueryDeviceStatus验证返回DEVICE_OK说明驱动就绪可以开始添加虚拟显示器了。已知限制以下为 Parsec VDD 的已知功能限制。1. 不支持 HDRParsec VDD 的显示器不支持 HDR可从其内置 EDID 看出EDID 十六进制全文见 docs/PARSEC_VDD_SPECS.md。理论上可以通过修改 EDID 加入 HDR 元数据与 10-bit 色深来解锁但无法像物理显示器那样刷固件——没有任何注册表开关可用。原因在于所有 IDD 驱动都把一份固定的 EDID 块内嵌在驱动二进制中用于初始化显示器规格。因此唯一的办法是修改驱动 DLLmm.dll内的 EDID 块再通过上文nefconwCLI 重新安装驱动。从源码结构看app/Display.cs 与 docs/PARSEC_VDD_SPECS.md 中给出的 EDID 是驱动内置的原始规格可作为修改前的基线。2. 自定义分辨率上限在建立连接前虚拟显示器会读取注册表HKLM\SOFTWARE\Parsec\vdd中额外的预设分辨率当前最多支持 5 条HKLM\SOFTWARE\Parsec\vdd: - key: [0 - 5] value: { width, height, hz }协议细节docs/PARSEC_VDD_RE.md 第 8 节显示每个槽位0–4下保存三个REG_DWORD值w宽、h高、hz刷新率驱动在适配器初始化时读取。C 侧写入代码形如RegCreateKeyExW(hkey, SOFTWARE\\Parsec\\vdd\\slot, ..., KEY_READ | KEY_WRITE, ...); RegSetValueExW(hkey, w, REG_DWORD, width, 4); RegSetValueExW(hkey, h, REG_DWORD, height, 4); RegSetValueExW(hkey, hz, REG_DWORD, refrate, 4);解锁该上限需要像修改 HDR 一样 patch 驱动 DLLmm.dll因为5 个槽位是驱动侧解析代码写死的——但对个人使用5 条自定义分辨率通常已经足够。已知问题与规避方案以下是使用独立版 Parsec VDD 时的已知问题清单。1. 与 Parsec 隐私模式不兼容如果在 Parsec Host 设置中启用了Privacy Mode隐私模式请将其禁用并清除以下注册表路径中的已连接显示器配置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity该选项会在虚拟显示器被添加时关闭主显示器导致主显示器难以重新点亮进而破坏远程桌面会话。从协议文档docs/PARSEC_VDD_RE.md 第 9 节看Parsec 的隐私模式本质是一个每 30 ms 轮询的host_vdd_privacy_thread通过SetDisplayConfig切换SDC_TOPOLOGY_INTERNAL熄屏与SDC_TOPOLOGY_EXTEND恢复与 ParsecDisplay 这类独立管理器同时运行时会在显示拓扑上互相争夺。2. Windows 10 Connectivity 注册表怪癖Windows 10 会以已连接显示器 ID 的组合为键缓存显示布局。当中间的显示器被拔出后剩余子集例如DISP001_DISP003是一个 Windows 从未见过的全新组合——这些显示器会回退到默认模式与默认布局。规避方案应用在睡眠、退出以及vdd remove all时总是按从右到左的顺序即最新驱动索引优先拔出显示器。这一策略在 app/Vdd/Controller.cs 的Suspend()与 app/CLI.cs 的RemoveDisplay中都有明确实现与注释说明。仓库 issue #23 对这一问题有完整的分析记录。3. 用户登录前无法无头运行ParsecDisplay 是 GUI 进程需要交互式用户会话Vista 的 session 0 隔离。在没有自动登录的无头主机上用户登录前不会有任何程序运行。README 给出的三种解决途径在主机上启用自动登录使用任务计划程序创建登录时运行并允许与桌面交互的任务使用基于服务的分支版本 ParsecVDA-Always-Connected面向完全无头的单显示器部署。与其他间接显示驱动的对比下表将 parsec-vdd 与其它流行的间接显示驱动IDD项目放在一起对比帮助判断选型项目Iddcx 版本已签名游戏HDR硬件光标可定制控制器usbmmidd_v2N/A✅❌❌❌❌IddSampleDriver1.2❌❌❌❌RustDeskIddDriver1.2❌❌❌❌❌Virtual-Display-Driver (HDR)1.10✅✅✅✅✅❌virtual-display-rs1.5❌✅❌✅✅✅parsec-vdd1.5✅✅❌✅✅✅ 完整支持 有限支持。表项含义Signed指驱动文件是否带有效数字签名H-Cursor指硬件光标支持——缺失时部分远程桌面应用会出现双光标Tweakable指能否定制显示模式Controller指是否有配套的独立管理控制器。parsec-vdd 的差异化优势在于已签名驱动 游戏可用 硬件光标 独立控制器的组合短板是默认不支持 HDR 且显示模式定制能力有限。基于 Parsec VDD 的生态项目社区围绕该驱动已构建了若干第三方库与应用parsec-vdd-rust核心 VDD API 的 Rust 移植作为 Rust 项目中添加/移除虚拟显示器并保活的即插即用方案Verto_XRXR/AR 眼镜桌面工作空间以 VDD 作为虚拟显示器源ParsecVDA-Always-Connected基于服务的分支跨重启与电源事件保持单个虚拟显示器常驻面向无头主机。显示模式与驱动规格速查README 摘录了常用预设显示模式完整清单含 DCI 4K、3:2 比例、笔记本常见分辨率等 30 余项见 docs/PARSEC_VDD_SPECS.md。常用模式如下分辨率通用名称宽高比刷新率Hz3840 x 21604K UHD16:924/30/60/144/2403440 x 1440UltraWide21.5:924/30/60/144/2402560 x 14402K16:924/30/60/144/2402560 x 1080UltraWide21:924/30/60/144/2401920 x 1080FHD16:924/30/60/144/2401600 x 900HD16:960/144/2401280 x 720HD16:960/144/240补充规格要点源自 docs/PARSEC_VDD_SPECS.md驱动默认显示模式为1920 x 1080 60 Hz所有分辨率均兼容 60 Hz驱动类型为 user mode用户态IddCx 版本 1.4 或 1.5适配器名称Parsec Virtual Display Adapter硬件 IDRoot\Parsec\VDA显示器 IDPSCCDD0名称ParsecVDA除增删/心跳 IOCTL 外v0.45 驱动还包含一个设置首选适配器 LUID的新 IOCTL0x800 5Parsec 应用当前未使用core/parsec-vdd.h 中标注为VDD_IOCTL_UNKONWN。命令行工具速览ParsecDisplay 安装后附带vdd命令行程序完整用法见 docs/VDD_CLI_USAGE.md常用命令vdd -a # 添加一个虚拟显示器退出码为驱动索引(0-15) vdd -r # 移除最后添加的显示器 vdd -r 0 # 移除索引 0 的显示器 vdd -r all # 按逆序移除全部规避 Win10 Connectivity 怪癖 vdd -l # 列出已添加显示器与规格 vdd -s 1 1920x1080 # 设置索引 1 的分辨率 vdd -s 1 1920x1080 120 # 设置分辨率刷新率Powershell 中用 r 代替 vdd -v # 查询驱动版本与状态退出码即状态码vdd -v输出示例Parsec Virtual Display Adapter - Status: OK - Version: 0.45状态码映射0OK、1INACCESSIBLE、2UNKNOWN、3UNKNOWN_PROBLEM、4DISABLED、5DRIVER_ERROR、6RESTART_REQUIRED、7DISABLED_SERVICE、8NOT_INSTALLED与 core/parsec-vdd.h 的DeviceStatus枚举一一对应其中NOT_INSTALLED对应驱动未安装。小结本文以 README 为主线完整覆盖了 Parsec VDD 的使用闭环从选择并安装合适的驱动版本nefconw命令行或/S静默模式到通过单头文件 core/parsec-vdd.h 在任意 C/C 项目中接入查状态 → 开句柄 → 心跳保活 → 增删显示器的标准流程再到规避 HDR、自定义分辨率上限、隐私模式冲突与 Windows 10 Connectivity 怪癖等已知问题。需要协议级细节IOCTL 字节布局、设备生命周期、状态码映射时docs/PARSEC_VDD_RE.md 是权威参考需要完整的 C/C API 函数参考时可查阅 docs/VDD_LIBRARY_USAGE.md需要完整显示模式清单与 EDID 数据时可查阅 docs/PARSEC_VDD_SPECS.md。赞分享桌面应用驱动开发【免费下载链接】parsec-vdd✨ Perfect virtual display for game streaming项目地址https://gitcode.com/gh_mirrors/pa/parsec-vdd点击查看免费下载相关推荐Parsec VDD虚拟显示驱动性能优化终极指南Parsec VDD虚拟显示驱动性能优化终极指南 Parsec VDD是一款功能强大的虚拟显示驱动工具能够创建高达4K 2160p240Hz的高性能虚拟显示桌面应用驱动开发如何突破物理显示限制Parsec VDD虚拟显示驱动的完整指南如何突破物理显示限制Parsec VDD虚拟显示驱动的完整指南 在现代数字工作环境中物理显示器的限制往往成为效率提升的瓶颈。Parsec VDDVirtu桌面应用驱动开发虚拟显示技术终极指南Parsec VDD驱动功能深度解析虚拟显示技术终极指南Parsec VDD驱动功能深度解析 虚拟显示技术正在彻底改变我们的数字体验方式✨ 无论你是游戏玩家、远程工作者还是内容创作者Pars桌面应用驱动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表