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.
文件
.githubassetsdocsdriverexamplesinstallerLICENSESsrctestsui.gitignore79 Bbuild-driver.ps15.3 KBbuild-installer.ps15.3 KBbuild.rs229 BCargo.lock147.3 KBCargo.toml1.6 KBLICENSE34.3 KBNOTICE.md1.2 KBREADME.md5.9 KBREADME.zh-CN.md5.2 KBrust-toolchain.toml124 BREADME.zh-CN.md5.2 KB
1
2
3
# SBMS4
5
[English](README.md)6
7
'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)8
'SBMS'的意思是SBMS连接多个显示器, 微软是一家伟大的公司, win是一个很棒的操作系统. (顺带一提我的笔记本装了企鹅系统(doge))9
10
'SBMS' 的初衷是补全windows多屏协作系统下默认逻辑桌面拓扑关系和显示器物理尺寸的计算规则. 11
12
'SBMS' 通过把一个(或多个) Windows 虚拟桌面全屏映射到指定的物理显示器来实现。当 Windows13
自带的扩展或复制模式无法满足分辨率、缩放比例或桌面布局需求时,可以用它14
建立一条独立的显示链路。15
16
从托盘中选择物理显示器并开始映射后,SBMS 会:17
18
- 按配置的尺寸和刷新率创建虚拟显示器;19
- 把目标显示器上的普通窗口迁移到虚拟桌面;20
- 将虚拟桌面映射回目标显示器;21
- 把鼠标输入转发给虚拟桌面上的 Windows 真实指针;22
- 停止时恢复窗口和原来的物理显示布局。23
24
映射运行期间新出现的窗口也会被迁移。25
26
托盘中最多可以保存十六组互相独立的本地镜像或纯串流配置。每组的显示器、27
尺寸、分辨率、刷新率、宽高比和方向会在普通重启及覆盖升级后保留。旧版单组28
配置会自动迁移为 **Output 1**。29
30
Quick Access 最多可以保存三套具名配置。配置菜单支持复制当前设置新建配置、31
切换、改名、删除,以及打开 JSON 存储目录。映射运行中切换配置时会先请求确认,32
随后使用所选配置重新启动映射。33
34
## 串流模式35
36
把一组输出切换为 **Stream only**,设置分辨率、刷新率和方向后开始映射。37
SBMS 会创建不映射到物理显示器的虚拟桌面,并为该输出启动一个独立的38
Sunshine 实例。托盘会显示局域网地址和端口,Moonlight 使用这个地址连接;39
点击 **Open Sunshine** 可以打开对应实例的网页面板完成配对和其他设置。40
停止映射时,SBMS 也会停止它管理的 Sunshine 实例。41
42
## 实现43
44
应用程序和生命周期逻辑使用 Rust。一个很小的 C++ UMDF 间接显示驱动通过45
WDF/IddCx 向 Windows 提供虚拟显示器。镜像链路使用 Desktop Duplication46
和 D3D11 着色器,全程留在 GPU 上,并包含面积缩放和轻量的子像素彩边抑制。47
48
托盘控制面板使用 Slint,安装和升级使用 Inno Setup。49
50
实现细节见[架构说明](docs/architecture.md)。GUI 开发可参考51
[尺寸计算接口](docs/geometry.md)和[多组映射接口](docs/mapping-plan.md)。52
53
## 安装和使用54
55
1. 从最新 GitHub Release 下载 `SBMS-Setup-1.5.1-x64.exe`。56
2. 运行安装包并批准管理员权限。57
3. 从系统托盘打开 SBMS,选择目标显示器,然后点击 **Start mapping**。58
4. 需要结束映射并恢复原始显示布局时,点击 **Stop and restore**。显示器拓扑意外59
变化时,SBMS 会自动尝试重连。60
61
SBMS 会随安装用户登录自动启动。可在 Windows“已安装的应用”中卸载,62
卸载器会同时移除驱动和自启动任务。63
64
当前安装包使用本地测试证书签名。驱动加载前,Windows 必须信任该证书,65
或者启用测试签名模式。要让普通用户无需额外设置即可安装,仍需使用微软认可66
的生产驱动签名。67
68
## 命令行69
70
日常使用建议通过托盘完成。管理员终端中也可以使用相同的生命周期:71
72
```powershell73
sbms list74
sbms map --target '<monitor-device-path>'75
sbms plan validate examples\two-streams.json76
sbms plan run examples\two-streams.json77
sbms config list78
sbms config show79
sbms config import gaming .\gaming.json --activate80
sbms shutdown81
```82
83
`sbms list` 会列出 `--target` 所需的稳定显示器 ID。前台运行 `map` 时按84
Enter,可以正常停止并完成恢复。映射计划最多可混合十六组本地镜像和纯串流85
虚拟桌面。最多可以同时保存三套配置;导入、导出、激活和热加载接口见86
[配置档案接口](docs/configuration.md)。87
88
## 构建89
90
需要 Rust、Visual Studio C++ Build Tools、匹配的 Windows Driver Kit、91
Inno Setup 6;构建发布包还需要代码签名证书。92
93
```powershell94
.\build-installer.ps1 -SigningCertificateThumbprint <thumbprint>95
```96
97
这是完整且唯一的发布入口:它会按锁文件构建 Rust 二进制、构建并签名驱动、98
生成安装包、验证所有签名,并把安装包及其 SHA-256 文件输出到99
`target\installer`。100
101
开发单个组件时,可分别使用 `cargo build --release --locked --bins` 或102
`.\build-driver.ps1`。需要检查完整的未签名构建与打包链时,必须显式使用103
`.\build-installer.ps1 -Unsigned`;它仍会编译并验证驱动,然后生成带104
`-unsigned` 后缀的冒烟测试产物,不得对外发布。105
106
## 致谢107
这是我第一个公开发布的 GitHub 项目,希望对您有所帮助。108
感谢我的所有朋友,尤其是Jerry和Tony,他们与我分享了他们的想法和建议。感谢我的CSA老师Mr Berti。感谢我的父母对我的支持。感谢住在美国的老哥帮我充值了我的OpenAI订阅。感谢Tibo为我重置了额度。感谢所有将我的想法落地的代理和子代理们。109