开发背景
在企业IT安全管理中,部分公司会设置5分钟自动锁屏策略。频繁的密码解锁操作虽保障了安全,但影响了工作效率。为此开发本工具,核心特点:
- 无需管理员权限
- 单文件绿色运行
- 系统托盘常驻
实现代码
系统托盘模块 (main.go)
package main
import (
_ "embed"
"fmt"
"github.com/getlantern/systray"
"time"
)
//go:embed icon.ico // 必须确保存在图标文件
var iconData []byte
func main() {
PreventSleep() // 启动防锁屏
systray.Run(onReady, onExit)
}
// 托盘初始化
func onReady() {
systray.SetIcon(iconData) // 设置托盘图标
systray.SetTitle("Anti-Lock") // 任务栏悬停显示
systray.SetTooltip("运行中") // 状态提示
// 创建退出菜单项
quitMenu := systray.AddMenuItem("退出", "关闭防锁屏功能")
// 异步监听菜单事件
go func() {
<-quitMenu.ClickedCh
systray.Quit()
}()
}
func onExit() {
fmt.Println("程序已安全退出")
}
防锁屏核心模块
package main
import (
"syscall"
)
const (
ES_CONTINUOUS = 0x80000000 // 持续生效标志
ES_SYSTEM_REQUIRED = 0x00000001 // 阻止系统休眠
ES_DISPLAY_REQUIRED = 0x00000002 // 阻止显示器关闭
)
// PreventSleep 调用Windows API实现防锁屏
func PreventSleep() {
kernel32 := syscall.NewLazyDLL("kernel32.dll")
execStateAPI := kernel32.NewProc("SetThreadExecutionState")
// 组合控制参数
flags := uintptr(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED)
ret, _, _ := execStateAPI.Call(flags)
if ret == 0 {
panic("API调用失败")
}
}
使用说明
-
准备图标
将icon.ico
图标文件与main.go放在同一目录 -
编译命令
go build -ldflags="-s -w -H=windowsgui" -o Sleep.exe
-
运行效果
- 双击运行生成的.exe文件
- 系统托盘区显示图标
- 右键点击可退出程序