手机云控 Windows 电脑锁屏
背景
在工作时,常会遇到这么一个场景:坐在电脑前办公,突然被叫了出去,可能出去只有一两分钟或几分钟,因此我不会将电脑锁屏,同时由于常用电脑做一些前台任务,电脑也不设置自动锁屏,但中断事件的时间是无法确定的,如果几十分钟甚至一两个小时还不回来,不锁屏的电脑无异于一台任人抚摸的小猫——吸引人且无力防御。
设计思路
反复几次后,我就萌生了写一个能远程云控电脑锁屏的小工具的想法,那样我只要在手机上设置一下锁屏,办公室的电脑就能自动锁屏了。思路也很简单:
flowchart TD A[用户操作] -->|云端控制台设置锁屏状态| B[发送锁屏状态至服务器] B --> C{服务器} C -->|存储状态| D[被控电脑] D -->|定期查询服务器状态| E{状态判断} E -->|“锁屏”| F[执行锁屏操作] E -->|“未锁屏”| G[保持当前状态] F --> D G --> D实现方案
按照上述思路,实现起来就很简单了。可以拆分成以下几个小步骤:
- 写一个云控控制台,能在手机上访问
- 云端控制器能存储当前状态,并供受控端读取
- 写一个锁屏器,在受控电脑上安装,自动获取云端当前状态,并实现锁屏操作
具体实现如下:
- 云端控制台为了让通用性更强,且更简化、更快捷实现,选择了网页端来部署,没有选择用 APP,不然还要考虑 Android/IOS/Mac 等各大系统适配。
- 状态存储器用 php 实现,原因:代码简单易写,服务器方便部署且通用性强。
- 锁屏器用 golang 来写,最初考虑过 Python,但综合考量打包体积、跨设备兼容和交叉编译支持情况,还是选择了 golang。
实现代码
云端控制台,一个 html 静态小网页
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>远程锁屏控制面板 - 怜渠客</title>
-
- <link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
-
-
- </head>
- <body >
-
- <header >
- <h1 >远程锁屏控制面板</h1>
- <p >通过此面板管理和查看远程设备的锁屏状态</p>
- </header>
-
-
-
- 当前状态: 未锁定
-
-
- 上次更新: 刚刚
-
-
- <button id="lock-btn" >
- <i ></i> 设置为锁屏状态
- </button>
- <button id="unlock-btn" >
- <i ></i> 设置为不锁屏状态
- </button>
-
-
-
-
- <h2 >
- <i ></i> 使用说明
- </h2>
- <ul >
- <li>点击"设置为锁屏状态"按钮,远程设备将在下次检查时锁定屏幕</li>
- <li>点击"设置为不锁屏状态"按钮,远程设备将保持解锁状态</li>
- </ul>
-
-
- <footer >
- <p>远程锁屏系统 © 2025 By 怜渠客</p>
- </footer>
-
- </body>
- </html>
复制代码 云端 php 代码
[code][/code]只是为了向同目录下的 state.txt 里写入或读取当前状态,0 或 1
golang 锁屏器
[code]package mainimport ( "fmt" "github.com/getlantern/systray" "github.com/lxn/win" "io/ioutil" "log" "net/http" "syscall" "time")const ( checkInterval = 5 // 检查间隔(秒) stateURL = "###目标服务器地址###/state_query.php")func main() { systray.Run(onReady, onExit)}func onReady() { systray.SetTitle("状态监控") systray.SetTooltip("系统状态监控程序") // 创建菜单项 mOpen := systray.AddMenuItem("打开", "打开主窗口") systray.AddSeparator() mQuit := systray.AddMenuItem("退出", "退出程序") // 初始隐藏控制台窗口 hideConsole() // 启动状态检查协程 go func() { log.Println("开始监控状态...") ticker := time.NewTicker(time.Second * checkInterval) defer ticker.Stop() for { select { case |