中文 · English
把一台电脑当成另一台电脑的第二显示屏,用网络连接——不需要 HDMI/DP 线。既能投整个屏幕(扩展屏), 也能只投某个程序窗口到另一台电脑上。支持局域网 / USB4 直连,和经中转服务器的配对连接(免端口转发/内网穿透)。
通用、对称、跨平台:任意两台电脑之间——Mac↔Windows、Windows↔Windows、Mac↔Mac——谁发谁收都行, 装好后配对一次即可互投。
- 主场景是局域网:同一局域网 RTT 个位数毫秒、USB4 直连 <1ms——此时是可交互的扩展屏体验 (在那块屏上拖窗口、打字、移鼠标都跟手)。
- 跨公网(经中转)也能用:延迟取决于中转节点位置(境外节点实测约 300ms),此时更接近低延迟远程投屏/演示/查看—— 看画面很流畅,但不适合把它当作实时交互的桌面。换个近的中转节点可把延迟降到几十毫秒。
- 一句话:局域网 = 真扩展屏;跨公网 = 远程投屏。都由同一套代码支持,区别只在网络。
⚠️ 两台机器「出口 IP 相同」不代表能直连(运营商级 NAT/CGNAT 的巧合,二层未必可达)——直连要真的在同一局域网或 USB4 直连。
到 Releases 下载:
| 平台 | 文件 | 说明 |
|---|---|---|
| macOS 14+ | NetDisplay-macOS.zip |
解压得 NetDisplay.app,拖进「应用程序」。菜单栏出现图标。 |
| Windows 10/11 | NetDisplay-<版本>-portable.exe |
免安装,双击即用。 |
macOS 首次运行:因为是自签名,会提示「无法验证开发者」——右键点 App →「打开」→ 再点「打开」即可。 另外需要在「系统设置 → 隐私与安全性 → 屏幕录制」里勾选 NetDisplay(投射画面必需)。
两端都要装:投射方和接收方都装同一个 App,谁投谁收在界面上选。
- 两台电脑都打开 NetDisplay。
- 任一台点「+ 添加设备」,选配对方式:
- 经中转(配对码)——不在同一局域网时用。一端点「随机生成」得到 6 位码,另一端输入相同的码,
两端都点「配对」,撮合成功才算配对(服务器只做撮合,不存任何数据)。
⚠️ 用中转必须先填好「中转设置」(见下一节),中转不可用时「配对」按钮是灰的。 - 直连(对方 IP)——在同一局域网时用,不经服务器。两端填相同的配对码+对方的局域网 IP,各自点「配对」。
- 经中转(配对码)——不在同一局域网时用。一端点「随机生成」得到 6 位码,另一端输入相同的码,
两端都点「配对」,撮合成功才算配对(服务器只做撮合,不存任何数据)。
- 配好后在「投射本机」页选投射内容(整块屏幕 / 某个程序窗口),点「开始投射」。 对方需要先开「接收显示」里的接收服务。
画质由投射方决定,接收方不需要(也没有)画质设置:
| 你选的 | 串流分辨率 | 对方怎么显示 |
|---|---|---|
| 跟随对方屏幕(默认) | 对方显示器的分辨率 | 第二显示器 / 全屏 |
| 指定分辨率 | 你选的值,超过对方屏幕会自动修正到不超过 | 窗口 |
| 投射某个窗口 | 窗口自身尺寸,同样不超过对方屏幕(等比缩小,不变形、不放大) | 窗口 |
投射过程中改分辨率/帧率会实时生效(重建画面源并通知对方),不用断开重连。
同一局域网不需要——用「直连(对方 IP)」即可,画面点对点走,延迟最低。
两台机器不在同一网络时需要(例如家里的 Mac 投给公司的 Windows)。中转服务器只做两件事: 撮合配对(把用同一个码的两端牵到一起)和转发字节(配对后双向透明转发)。 它不解析视频、不存储任何数据、没有用户系统——所以自己搭一个很轻量。
想直接用而不自建?在「中转设置」里填任何一台你信任的、跑着本服务的机器地址即可。 本项目不提供公共服务器,请自建(下面 5 分钟搞定)。
git clone https://github.com/ghbhiee/netdisplay.git
cd netdisplay/relay
go build -o netdisplay-relay .
sudo cp netdisplay-relay /usr/local/bin/设置访问 Token(强烈建议,否则端口暴露在公网上谁都能用)并作为 systemd 服务常驻:
sudo cp netdisplay-relay.service /etc/systemd/system/
sudo mkdir -p /etc/systemd/system/netdisplay-relay.service.d
printf '[Service]\nEnvironment=NETDISPLAY_RELAY_TOKEN=%s\n' "$(openssl rand -hex 24)" \
| sudo tee /etc/systemd/system/netdisplay-relay.service.d/token.conf
sudo systemctl daemon-reload
sudo systemctl enable --now netdisplay-relay
sudo journalctl -u netdisplay-relay -f # 看日志确认「listening on :47700」放行防火墙的 TCP 47700(直接暴露,不要套 nginx——裸 TCP 长连接转发不适合走反代):
sudo ufw allow 47700/tcp把刚才生成的 token 记下来(cat /etc/systemd/system/netdisplay-relay.service.d/token.conf)。
两端都打开「中转设置」,填同样的:
- 中转服务器地址:
你的域名或IP:47700 - 访问 Token:上面生成的那串(留空 = 不鉴权,只建议内网自用)
填完会立刻显示「中转 · 可用 XXms」。只有显示可用,配对界面的「配对」才能点。
安全性:服务器只转发密文之外的原始字节流,不解析内容;配对码只在两端同时处于配对界面时才可能撮合成功, 关掉窗口即失效,不会被别人拿码蹭连。
只有把 Windows 当作「投射方」、并且想投出一块「新的扩展屏」时才需要。
Windows 本身没有系统级的虚拟显示器 API(Mac 有 CGVirtualDisplay,所以 Mac 不需要装任何东西)。
不装 VDD 时,Windows 投「整个屏幕」只能把现有的某块屏复制过去(镜像)——你在那块屏上看到的和本机一样。
装了 VDD 会多出一块系统认为真实存在的显示器,把它投射出去,才是真正的扩展屏(可以往上拖窗口、放不同内容)。
- 装在哪台:要投射出去的那台 Windows(发送方)。接收方不用装。
- 项目地址:https://github.com/VirtualDrivers/Virtual-Display-Driver (IddCx 间接显示驱动,Windows 10/11,MIT,开源免费)
- 驱动是已签名的(SignPath Foundation 提供的免费签名),不需要关闭「驱动程序强制签名」。 网上一些老教程要你进测试模式/禁用签名强制——对这个驱动不必要,也不该那么做。
- 装 Microsoft Visual C++ 运行库(依赖
vcruntime140,缺了会报错)。 - 下载 VDD,二选一:
或到 Releases 下载压缩包解压 (免安装便携版)。ARM64 设备需要用官方说明里的手动安装方式。
winget install --id=VirtualDrivers.Virtual-Display-Driver -e
- 以管理员身份运行 Virtual Driver Control (VDC),点 Install。
- 在「设置 → 系统 → 显示」里会多出一块显示器;把它设为「扩展这些显示器」(不要选「复制」)。 这块虚拟屏的分辨率/刷新率可以在 VDC 里加或调整。
- 打开 NetDisplay →「投射本机」→ 投射内容的「整块屏幕」下会多出
Screen 1 / Screen 2—— 选那块虚拟屏 → 开始投射。
装好后,往那块虚拟屏拖窗口,对面就能看到——这才是「多一块显示器」而不是「复制一块」。
⚠️ 升级显卡/芯片组驱动前,先在 VDC 里卸载 VDD,否则可能出现黑屏或显示优先级冲突。 万一真黑屏:进安全模式 → 设备管理器 → 卸载该虚拟显示适配器。
| 目录 | 内容 | 平台/语言 |
|---|---|---|
mac/ |
Mac 端(发送 + 接收,菜单栏 App) | macOS / Swift(SwiftPM) |
windows/ |
Windows 端(发送 + 接收) | Windows / Electron + WebCodecs |
relay/ |
中转服务器(配对撮合 + 字节转发) | Linux / Go |
docs/ |
协议规范(SOT)、架构、各端进展/任务 | Markdown |
- Mac:
cd mac && swift build -c release,或bash scripts/make-app.sh release出菜单栏 App。 - Windows:见
windows/(npm install && npm start,或npm run dist出 portable exe)。 - 协议:改动前先读
docs/02-protocol.md(唯一依据 / SOT)。
两个 AI(Mac 端 / Windows 端)分别负责各自平台,以 Mac 端为架构主导;通过本仓库同步代码与需求,
协议改动先改 docs/02-protocol.md 并记 changelog。
guohongbo · guohongbo@outlook.com · https://github.com/ghbhiee/netdisplay
参考 peetzweg/opendisplay(GPL-3.0)的私有 CGVirtualDisplay 头文件, 本项目个人自用,沿用 GPL-3.0。