Sunshine Moonlight 作为虚拟显示器拓展副屏的方案!作为一个 APP 点开即副屏!

因为买的丐中丐版 RX560 只有一个 HDMI,家里还有其他的什么 iPad 和笔记本什么的啊,如果能借助内网串流作为副屏使用就好了呢。

虽然咱是试过用 Parsec 串流的,奈何 Parsec 服务器经常内啥,连个远程搞半天,更致命的是还不支持 iOS/iPadOS!

突然想到用 Sunshine + Moonlight 不就挺好嘛?然后就开始了新一轮的折腾(

i. 整理思路避免 CPU 被干烧(

目的:很明确!在 Moonlight 中显示一个 APP,点击启动后就可以变成一个副屏,不需要咱再进行任何操作!

然后,这里是一些会造成麻烦或给予帮助的特性,以及一些……解决办法?

特性解决方案
咱没有多的显示器(采用虚拟显示器(usbmmidd)
Sunshine 默认只会串流当前的主显示器。且一旦串流开始,即使主显示器变更,也不会更改串流对象在串流开始前,添加虚拟显示器并设置为主显示器,待串流开始后,将主显示器设置回实体屏幕
原生 Windows 没有通过命令行更改主显示器的指令采用外置软件更改主显示器(UltraMon)
但是……弹出 UAC 提示框咋办?使用计划任务绕过 UAC(UAC白名单小工具.exe)

ii. 一些准备工作

1. 安装 Sunshine

这个是 Moonlight 串流客户端对应的开源服务端,去 Releases 找到最新的 Windows Installer 安装就行啦!
https://github.com/LizardByte/Sunshine/releases

2. 安装 UltraMon

这个东西是一个强大的多显示器增强软件(曾经),现在到了 Windows 11 了,它的很多功能已经不适用了。幸好咱用不到!咱只需要它切换主副显示器的功能!

这是一个收费软件,资源咱不能提供,还请自行寻找并安装了呢。

安装完成后,建议关掉以下功能避免影响 Windows 11 使用体验。

  • 关闭 Smart Taskbar 选项卡下的 use Smart Taskbar
  • 关闭 Buttons and Menu Commands 选项卡下的所有复选框
  • 没了!点击确定就好啦
关于 UltraMon 的命令行用法,请见 https://www.realtimesoft.com/ultramon/scripts/

3. 下载 usbmmidd

这是一个添加/移除虚拟显示器的程序包,要用到里面的一些东西!

下载地址:https://www.amyuni.com/downloads/usbmmidd_v2.zip

这是官方原发布页面:https://www.amyuni.com/forum/viewtopic.php?t=3030

提示:请务必务必找一个稳妥的文件夹存放本教程中提到的所有东西!不然假如后面要重装,搞起来会很麻烦哦!
例如:可以找一个目录 C:\Sunshine 作为根目录,然后把 usbmmidd 里面所有东西扔进 C:\Sunshine\usbmmidd 里。后面还有其他东西要存放呢。

4. 下载 UAC 白名单小工具

这个东西可以帮咱执行指定脚本的时候绕过 UAC!

下载地址:https://github.com/XIU2/UACWhitelistTool/releases

打开备用即可!

⚠⚠⚠ 安全警告:将对特定脚本授予绕过 UAC 执行的能力!假如这个脚本可以被任何程序写入的话,那就谁都可以执行任意代码了,将会非常危险的说!所以请在教程结束后,取消任何用户对接下来提及的脚本文件的写入权限!

iii. 开始配置!

1. 编写脚本文件

(1) 编写切换主次显示器的脚本文件

提示:以下编写的所有脚本文件请务必全部放进 usbmmidd 所在的目录!不然执行失败别打我(

需要编写的脚本:

文件名作用
SetPrimary1.vbs将第一个显示器(物理显示器)设置为主显示屏
SetPrimary2.vbs将第二个显示器(usbmmidd 的虚拟显示器)设置为主显示屏
CallSetPrimary1.bat用于延迟调用 SetPrimary1.vbs(得给 Moonlight 一点发呆的时间嘛()

SetPrimary1.vbs

Const PRIMARY_MON = 1 'number of the monitor that should be set as the new primary monitor after enabling secondary monitors
Set sys = CreateObject("UltraMon.System")
sys.Monitors(PRIMARY_MON - 1).Primary = True
sys.ApplyMonitorChanges

SetPrimary2.vbs

Const PRIMARY_MON = 2 'number of the monitor that should be set as the new primary monitor after enabling secondary monitors
Set sys = CreateObject("UltraMon.System")
sys.Monitors(PRIMARY_MON - 1).Primary = True
sys.ApplyMonitorChanges

CallSetPrimary1.bat

timeout /nobreak /t 4
start SetPrimary1.vbs

注意:请务必测试一下自己的系统能不能用 timeout 命令实现延时执行!如果不行的话……还请自己想个办法?

(2) 使用 UAC 白名单小程序将 CallSetPrimary1.bat 添加进任务计划程序

打开 UAC 白名单小程序,将 CallSetPrimary1.bat 拖进窗口中,此时会发现路径自动复制好了:

但是!还没完呢!务必记得把第四行的起始位置也填写好!起始位置就是 usbmmidd 所在的目录,比如 C:\Sunshine\usbmmidd。如果实在不知道的话,可以把第一行的脚本路径复制到第四行,然后删掉后面的 CallSetPrimary1.bat 就是起始位置了哦

填好以后会变成这样:

备注:咱改了文件夹的名字!请千万别照抄,一定要按照实际情况填写!

然后呢……还需要找到执行的地方!

现在得回到桌面找到 noUAC.CallSetPrimary1 这个快捷方式,Alt + Enter 打开属性,把「目标」文本框中的内容复制下来备用。

然后请继续吧!

(3) 添加虚拟显示器

首先需要先打开一个具有管理员权限的命令行窗口!

快捷键 Win + R 打开运行,输入最喜欢的终端名字(wt / ps / cmd 都可以),然后使用快捷键 Ctrl + Shift + Enter 就可以以管理员身份打开啦

然后 cd 到 usbmmidd 所在目录,执行:

deviceinstaller64 install usbmmidd.inf usbmmidd

然后同意安装,现在应该可以了!

注意:请不要多次运行此程序!因为运行一次就会添加一个新的虚拟显示器,咱不知道存在多个虚拟显示器的时候会发生什么事!所以还请不要自己给自己找麻烦啦

如果要移除虚拟显示器,请以管理员身份执行:

deviceinstaller64 stop usbmmidd
deviceinstaller64 remove usbmmidd

(4) 编写启用、禁用虚拟显示器的脚本文件

提示:以下编写的所有脚本文件请务必全部放进 usbmmidd 所在的目录!不然执行失败别打我(

需要编写的脚本:

文件名作用
_Disable Monitor.bat禁用虚拟显示器
_Enable Monitor.bat启用虚拟显示器
_Enable Monitor with timeout.bat用于延迟调用 _Enable Monitor.bat(得给 Moonlight 一点发呆的时间嘛

注意:这里文件名前面有下划线,是为了方便区分而弄的,请不要忘记复制了!

_Disable Monitor.bat

deviceinstaller64 enableidd 0

_Enable Monitor.bat

deviceinstaller64 enableidd 1

然后有个重要的操作!请按前面的方法为 _Disable Monitor.bat_Enable Monitor.bat 添加 UAC 白名单,并同样复制启动命令备用!

接着请继续编写脚本吧!

_Enable Monitor with timeout.bat

C:\Windows\system32\schtasks.exe /run /tn "noUAC._EnableMonitor"
timeout /nobreak /t 6
start SetPrimary2.vbs
timeout /nobreak /t 4
C:\Windows\system32\schtasks.exe /run /tn "noUAC.CallSetPrimary1"

注意:如果刚刚没有乖乖按照咱说的来做的话……现在就有惩罚咯(x请手动完成下面两条修改!

  • 第 1 行请替换为自己的 _Enable Monitor.bat 对应的启动命令
  • 第 5 行请替换为自己的 CallSetPrimary1.bat 对应的启动命令

(5) 配置 Sunshine

打开 Sunshine Web UI,找到「Applications」选项卡

点击「Add New」,然后按照以下步骤操作:

  • Application Name:瞎填就可以了,咱起名叫「External Screen」
  • Global Prep Commands:设置为 False 可能会好一些?毕竟假如以后搞了些什么破坏了这个功能咋办(
  • Command Preparations:这个是重点!

    • 点击
    • 然后在「Do Command」中填入 _Enable Monitor with timeout.bat 的绝对路径!(一定记得带引号啊!)
    • 然后在「Undo Command」中填入 _DisableMonitor 的启动命令!默认:C:\Windows\system32\schtasks.exe /run /tn "noUAC._DisableMonitor"

这样就完成啦!如果你想的话,还可以自己设计一个 Cover 并把路径填入「Image」一栏中

(6) 然后?

然后理论上不会遇到任何问题了!打开其他设备,找到「External Screen」试试行不行吧!

假如遇到了打开后还是物理显示器的问题的话,可以试试把延迟时间调高些?

好,就这样(逃

评论区
头像
    头像

    手动输脚本属实有点累w,找了好几个教程终于实现多屏显示了,有个问题就是程序启动好像只会在主屏而不是副屏,分辨率也没有自动适应(在moonlight中已设置当前分辨率),不知道是不是sunshine的问题

      头像
      @可受的猪灵

      这样的吗 我已经转到linux了诶(

文章目录