Evan's Blog
EvanZhu0721 / 公开仓库

SBMS

镜像已同步

SBMS complete the calculation rules for the default logical desktop topology relationship and the physical dimensions of the displays in the Windows multi-screen collaboration system.

上游 GitHub
READ-ONLY MIRROR

README、源码与 Release 已保存到本站;源码视图固定到 commit a37d6c4b。

README.zh-CN.md
来源 commit a37d6c4b 阅读模式 查看源码

SBMS banner

SBMS

English

'SBMS' stands for "SBMS bridges multiple screens", Microsoft is a great company and Windows is a good system. (BTW I use Linux for laptop XD) 'SBMS'的意思是SBMS连接多个显示器, 微软是一家伟大的公司, win是一个很棒的操作系统. (顺带一提我的笔记本装了企鹅系统(doge))

'SBMS' 的初衷是补全windows多屏协作系统下默认逻辑桌面拓扑关系和显示器物理尺寸的计算规则.

'SBMS' 通过把一个(或多个) Windows 虚拟桌面全屏映射到指定的物理显示器来实现。当 Windows 自带的扩展或复制模式无法满足分辨率、缩放比例或桌面布局需求时,可以用它 建立一条独立的显示链路。

从托盘中选择物理显示器并开始映射后,SBMS 会:

  • 按配置的尺寸和刷新率创建虚拟显示器;
  • 把目标显示器上的普通窗口迁移到虚拟桌面;
  • 将虚拟桌面映射回目标显示器;
  • 把鼠标输入转发给虚拟桌面上的 Windows 真实指针;
  • 停止时恢复窗口和原来的物理显示布局。

映射运行期间新出现的窗口也会被迁移。

托盘中最多可以保存十六组互相独立的本地镜像或纯串流配置。每组的显示器、 尺寸、分辨率、刷新率、宽高比和方向会在普通重启及覆盖升级后保留。旧版单组 配置会自动迁移为 Output 1。

Quick Access 最多可以保存三套具名配置。配置菜单支持复制当前设置新建配置、 切换、改名、删除,以及打开 JSON 存储目录。映射运行中切换配置时会先请求确认, 随后使用所选配置重新启动映射。

串流模式

把一组输出切换为 Stream only,设置分辨率、刷新率和方向后开始映射。 SBMS 会创建不映射到物理显示器的虚拟桌面,并为该输出启动一个独立的 Sunshine 实例。托盘会显示局域网地址和端口,Moonlight 使用这个地址连接; 点击 Open Sunshine 可以打开对应实例的网页面板完成配对和其他设置。 停止映射时,SBMS 也会停止它管理的 Sunshine 实例。

实现

应用程序和生命周期逻辑使用 Rust。一个很小的 C++ UMDF 间接显示驱动通过 WDF/IddCx 向 Windows 提供虚拟显示器。镜像链路使用 Desktop Duplication 和 D3D11 着色器,全程留在 GPU 上,并包含面积缩放和轻量的子像素彩边抑制。

托盘控制面板使用 Slint,安装和升级使用 Inno Setup。

实现细节见架构说明。GUI 开发可参考 尺寸计算接口和多组映射接口。

安装和使用

  1. 从最新 GitHub Release 下载 SBMS-Setup-1.5.1-x64.exe。
  2. 运行安装包并批准管理员权限。
  3. 从系统托盘打开 SBMS,选择目标显示器,然后点击 Start mapping。
  4. 需要结束映射并恢复原始显示布局时,点击 Stop and restore。显示器拓扑意外 变化时,SBMS 会自动尝试重连。

SBMS 会随安装用户登录自动启动。可在 Windows“已安装的应用”中卸载, 卸载器会同时移除驱动和自启动任务。

当前安装包使用本地测试证书签名。驱动加载前,Windows 必须信任该证书, 或者启用测试签名模式。要让普通用户无需额外设置即可安装,仍需使用微软认可 的生产驱动签名。

命令行

日常使用建议通过托盘完成。管理员终端中也可以使用相同的生命周期:

sbms list
sbms map --target '<monitor-device-path>'
sbms plan validate examples\two-streams.json
sbms plan run examples\two-streams.json
sbms config list
sbms config show
sbms config import gaming .\gaming.json --activate
sbms shutdown

sbms list 会列出 --target 所需的稳定显示器 ID。前台运行 map 时按 Enter,可以正常停止并完成恢复。映射计划最多可混合十六组本地镜像和纯串流 虚拟桌面。最多可以同时保存三套配置;导入、导出、激活和热加载接口见 配置档案接口。

构建

需要 Rust、Visual Studio C++ Build Tools、匹配的 Windows Driver Kit、 Inno Setup 6;构建发布包还需要代码签名证书。

.\build-installer.ps1 -SigningCertificateThumbprint <thumbprint>

这是完整且唯一的发布入口:它会按锁文件构建 Rust 二进制、构建并签名驱动、 生成安装包、验证所有签名,并把安装包及其 SHA-256 文件输出到 target\installer。

开发单个组件时,可分别使用 cargo build --release --locked --bins 或 .\build-driver.ps1。需要检查完整的未签名构建与打包链时,必须显式使用 .\build-installer.ps1 -Unsigned;它仍会编译并验证驱动,然后生成带 -unsigned 后缀的冒烟测试产物,不得对外发布。

致谢

这是我第一个公开发布的 GitHub 项目,希望对您有所帮助。 感谢我的所有朋友,尤其是Jerry和Tony,他们与我分享了他们的想法和建议。感谢我的CSA老师Mr Berti。感谢我的父母对我的支持。感谢住在美国的老哥帮我充值了我的OpenAI订阅。感谢Tibo为我重置了额度。感谢所有将我的想法落地的代理和子代理们。