Windows 上创建虚拟显示器用于串流

2023-01-08 649点热度 2人点赞

Parsec TightVNC 等远程软件连接没有显示器的电脑时黑屏了怎么办?远程办公的时候不想被看到屏幕怎么办,用虚拟显示器来解决问题


1 、 Windows 显示黑屏的缘由

在曾经的 模拟信号 显示时期,主机 和 显示器 之间是通过传递 明度 Y/色差 的方式发送数据的。那时想看电视,需要三根线,分别是 红/蓝/黄 (绿) 对应传输 红绿偏离/蓝绿偏离/色彩明度,传输的数值完全取决于模拟信号的电平高低,而对应 显示器 上则需要经过数学计算转换为 HSL 或 HSB 进而在电视中体现 色相 饱和度 对比度/明度。

在模拟信号时期,因为输出设备的导线是单向直出的,电路并不知道外面有什么设备,只能希望是一个标准的显示器,不管什么时候都是尽可能的提供着信号,希望外接设备用一根导线来保证想需要连接的部分能通讯,所以这时并没有考虑如何检测对端设备,也没有判断对端设备是否符合的条件,于是出现了 VESA DDC1 (VESA Display Data Channel) 用来参照 EDID 协议读取对面显示器的 厂家型号分辨率刷新率 等信息。后来经过多代版本更替,接口虽然变了,但这个协议以及信息读取保留了下来,随着 DVI/HDMI/DP 等数字接口的问世,频率与刷新率的多样化,逐渐普及开来。

这时候有一个一直以来的需求出现了一些变化,那就是休眠。模拟信号时期关掉输出设备后,我们还需要关闭显示器,因为如果不关闭的话,显示器的背光或者阴极射线管始终在通电工作,十分费电且损运行寿命。输出设备能不能告诉显示器该关了,又或者显示器能不能主动请求输出设备停止工作或者发过来信号, EDID 协议表示这都可以,于是此需求友好的推进并实施了

  • 对端没有设备 = 不工作
  • 对端有设备但不支持 = 不工作

而接下来随着支持 EDID 设备的普及,以及 HDMI/DP 等协议的推广,厂家完全可以实现另外两种情况继续节能环保

  • 对端有设备但不符合协议要求 = 不工作
  • 对端有设备但接触不良 = 不工作

此时只要两端有一方不能按照 EDID 协议进行握手宣告,那另一方就可以直接不工作了。也就变成了默认黑屏

此时只要 HDMI/DP 不能检测到对方是一个设备,就不提供任何输出信号,进而没有任何显示。

但是无论怎么改,因为 旧 VGA 是模拟信号且不会读取显示器信息,所以为了兼容性 新 VGA 就不可避免的需要一直提供电平输出保障信号传递,也就不可避免的需要一直工作,也就不可避免的 支持 VGA 强制输出。(这点在服务器上有体现,大多数服务器都有 VGA 口,在连接服务器后也就默认有着显示输出)


2 、 Windows 实现虚拟显示器

我们其实有如下的方法实现虚拟显示器

  • 显示接口强制输出 VGA(始终尝试在以下对象上进行连接:VGA)
  • NVIDIA GRID 的 Virtual Monitoring
  • HDMI/DP 显卡欺骗器
  • VNC 虚拟显示器
  • Windows 间接显示驱动
  • 其他实现

Windows 10 1607 以前版本是可以看到所有的显示接口的,所以可以手动选择 始终尝试在以下对象上进行连接:VGA

NVIDIA GRID 只有工程用显卡才支持,消费者级是不可以的。

显卡欺骗器本质就是弄一个写死的数据包假装是一台显示器,但是据厂家陈述对于 CPU 集显 存在兼容问题

VNC 方案具体取决于 软件提供方,比如 UVNC 是支持的 [ 链接 ],而 Tightvnc 是不支持的。

Windows 间接显示驱动,来源 [ 链接 ]

Parsec 新版本已经支持了 Virtual Display ,可以直接登陆进去。


3 、 Amyuni USB Monitor

上面的办法如果觉得不太方便,其实我们可以使用软件的方式来实现

因为在系统层面,显示本质上还是驱动程序进行运算的结果,那么只要有个厂家在写一个含数字签名的驱动时,允许无显示器还能输出信号就好了

Amyuni USB Mobile Monitor 这个厂家就做了一个驱动 [ 链接 ]

按照说明并下载,然后存放到一个目录下,比如本例为 C:\Program Files\usbmmid_v2

存放后进入目录,运行 usbmmidd.bat 即可完成初次配置,或者手动运行下列命令

cd C:\Program Files\usbmmid_v2
deviceinstaller64.exe install usbmmidd.inf usbmmidd

后期使用仅需要运行一条命令即可启用(放进计划任务即可)

C:\Program Files\usbmmid_v2\deviceinstaller64.exe enableidd 1

如果不需要此驱动并想卸载,可以在设备管理器的显示适配器中删除该设备,或者运行下列命令

cd C:\Program Files\usbmmid_v2
deviceinstaller64.exe stop usbmmidd
deviceinstaller64.exe remove usbmmid

如果想修改屏幕分辨率,则需要进入注册表修改键值(默认值 @和支持的分辨率值 0-5)

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\usbmmIdd\Parameters\Monitors]
@="1920,1080"
"0"="1024,768"
"1"="1366,768"
"2"="1600,1200"
"3"="1920,1080"
"4"="2560,1440"
"5"="3840,2160"

4 、其他问题

4.1 、远程后不显示鼠标指针

现象:远程连接后不显示鼠标,但可以移动鼠标并点击屏幕相应区域以及获得反馈

原因:当设备没有任何鼠标输入时,Windows 默认关闭鼠标指针 [ 链接 ]

解决:设置-轻松使用-鼠标-启用鼠标键 (小键盘移动鼠标)

解决:安装触摸板驱动,比如 Wacom


StarryVoid

Have a good time