# DeskPeek **Repository Path**: known/DeskPeek ## Basic Information - **Project Name**: DeskPeek - **Description**: DeskPeek 是一个 Windows 单文件工具,把手机变成自己电脑的一块小监视器,顺手能点一下。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-10-13 - **Last Updated**: 2026-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DeskPeek 把手机变成自己电脑的一块小监视器,顺手能点一下。 DeskPeek 是一个 Windows 单文件工具:抓本机屏幕,用 MJPEG 直接推给手机浏览器,局域网里打开网址就能看;需要的话,手机上点一下屏幕就等于在这台电脑上落一次左键。手机上不用装任何 App,也没有账号、配对码。 > *Turn your phone into a peek-at-your-PC monitor over LAN — live screen streaming in any mobile browser, with optional tap-to-click.* ## 它适合什么,不适合什么 适合:坐在沙发上想瞄一眼电脑上的AI开发、下载进度、监控页面、跑到哪一步的编译;需要时点一下"继续/暂停"。 不适合:需要完整远程控制(键盘、拖拽、右键、多路视频、文件传输)请用 [RustDesk](https://github.com/rustdesk/rustdesk) 或系统自带的远程桌面。DeskPeek 刻意只做"看"和"点一下",所以它不需要在手机上装东西,也不会因为你手滑而拖走窗口。 ## 功能 - **屏幕直播**:GDI 抓整块虚拟屏幕(含多显示器),以 `multipart/x-mixed-replace` 推 JPEG 流,任何浏览器都能显示,包括微信内置浏览器 - **可调参数**:帧率 1–30fps(默认 10)、JPEG 质量 10–100(默认 60)、是否缩到 1280 宽(默认开,省流量) - **断流自动重连**:10 秒收不到帧就判定断开,按 1s→8s 指数退避重连;切到后台暂停、回前台立刻重连。不然浏览器不会自己重连 multipart 流,画面会永久停在最后一帧,看起来像"连不上" - **直播期间防睡眠**:`SetThreadExecutionState(ES_SYSTEM_REQUIRED)`,只拦系统睡眠,不动显示器的电源策略;停止服务或退出即恢复 - **横屏自适应**:优先用 `screen.orientation.lock`,不支持时(如 iPhone Safari)用 CSS 旋转兜底;横屏时工具栏浮在左上角,任何时候都能退出横屏、切换触控 - **双指缩放**:整块桌面压到手机屏幕上字是看不清的,所以画面上两根手指张开就能放大(1–6 倍),捏合缩小;放大后**一根手指拖着就能看旁边**(两根手指拖也行),因为点击是按"抬手前没拖动"判定的,开着触控照样能拖。转屏或视口尺寸变化会自动回到 1 倍,工具栏上那个 `2.4x` 按钮点一下也直接还原。缩放只作用在显示层,点击传的仍是 0~1 比例,所以放大后点哪儿就是哪儿 - **可选点击控制**:手机点一下 = 电脑左键一次。传的是 0~1 的画面比例而不是像素,所以"缩小到 1280 宽"、系统 DPI 缩放、多显示器负坐标都不会让落点跑偏 - **访问口令**:HTTP Basic 和登录页会话 cookie 两条路都认。只勾开关不填口令时点击控制不会生效,状态行会点名差哪一项 - **公网转发**:自带 frp 集成,写 `frpc.toml` 并拉起 `frpc.exe`,支持 TCP 远程端口和 HTTP 子域名两种隧道 - **防火墙自动放行**:启动时按当前端口重建名为 `DeskPeek-ScreenLive` 的入站规则(规则已存在则先删再加),失败只在状态行提示,不会静默卡住 - **收进托盘**:最小化即隐藏到托盘,服务继续跑;双击托盘图标恢复窗口 - **零遥测**:不联网上传任何东西,屏幕数据只走你自己的局域网或你自己的 frp 服务器 ## 快速开始 1. 右键 **以管理员身份运行**。服务绑定的是 `http://+:端口/`(监听所有网卡),不是管理员会启动失败。 2. 确认端口(默认 `8080`,可用范围 1024–65535)。 3. 想用手机点击的话:勾选 **允许手机点击控制**,并在 **访问口令** 里把用户名和密码都填上——少任何一项都点不动。 4. 点 **启动服务**。状态行会打印手机真正能访问的地址,取的是默认路由那张网卡的 IPv4,多网卡时其余地址也会列出来。 5. 手机连同一个路由器/Wi-Fi,浏览器打开那个地址,输入口令,进画面。 6. 要点击就先点页面上的 **触控**(按钮变橙色才是开着),默认关着是防止误触。字看不清就用两根手指把画面撑开,工具栏会出现当前倍数,点一下它就能还原。 状态行会实时反映配置结果,例如: ``` 运行中,手机访问:http://192.168.1.3:8080/ 手机打开会先要口令(页面上输,微信里也能登) 手机点击已开启 ``` ## 点击控制生效的条件 | 条件 | 在哪设置 | 不满足时手机上看到 | | --- | --- | --- | | 勾选"允许手机点击控制" | 电脑端主界面 | `403 点击控制未开启:电脑上没有勾选…` | | 用户名非空 | 电脑端"访问口令" | `403 点击控制未开启:电脑上的访问用户名是空的` | | 密码非空 | 电脑端"访问口令" | `403 点击控制未开启:电脑上的访问密码是空的` | | 页面"触控"处于开启 | 手机端工具栏 | 点了没反应(不发包,避免误触) | 限流:`/click` 最快 100ms 一次(约每秒 10 次),超了返回 `429 点击太快`。 ## 已知限制 - **点不到锁屏和 UAC**:Windows 不允许向安全桌面注入输入。锁屏、UAC 提权弹窗、切换用户后的界面都只能看不能点。 - 只有左键单击,没有键盘、拖拽、右键、滚轮。页面上的一根手指:没拖动就是点一下,拖动就是挪画面;两根手指是缩放。都不会变成电脑上的拖拽。 - 双指放大只是把画面撑大,不会凭空变清晰:源图是按你设定的帧率、质量和是否缩到 1280 宽编码的。要看清小字,把质量调到 80 以上、关掉"缩小到 1280 宽"再配合放大。 - 全程 HTTP 明文。局域网内无所谓,但开着 frp 转发公网时,登录页会用明文 POST 提交口令——那种场景务必设强口令,而且状态行会直接警告"公网那端可以试口令并直接操作这台电脑"。 - 帧率受抓屏 + JPEG 编码耗时限制,设定值只是上限,实际达不到时以实际为准。 - 只能跑在 Windows(GDI 抓屏);手机端不需要装任何东西。 ## 构建 - 目标框架:`.NET Framework 4.7.2`(需要对应的 Targeting Pack),Windows Forms,无第三方依赖。 - Visual Studio 打开 `DeskPeek.slnx`,或命令行: ``` MSBuild.exe -t:Rebuild -v:minimal DeskPeek.csproj ``` 产物在 `bin\Debug\DeskPeek.exe`。 ## 配置与文件位置 | 内容 | 位置 | | --- | --- | | 用户设置(端口、帧率、口令、点击开关等) | `%LOCALAPPDATA%\DeskPeek\settings.json` | | 生成的 frpc 配置 | `%LOCALAPPDATA%\DeskPeek\frpc.toml` | | 防火墙规则 | 名称 `DeskPeek-ScreenLive`,方向入站,TCP,跟随当前端口 | 口令以明文存在上面那个 `settings.json` 里,请把这台机器当作你自己的电脑来对待。 ## frp 转发 需要自备 [frp](https://github.com/fatedier/frp) 的 `frpc.exe`(DeskPeek 不打包它)。展开"公网转发设置",填 frpc 路径、服务器地址与端口、token,隧道类型二选一: - **TCP 远程端口**:访问 `http://服务器:远程端口/` - **HTTP 子域名**:需要 frps 配好对应的域名后缀 勾选"启动服务时同时开启转发"后,frpc 会跟着服务一起起停,它的输出显示在转发状态里。 ## 许可 Apache License 2.0,见仓库根目录的 `LICENSE`。