// Copyright (c) 2026 S.A. (SNOWARE). Written for SCU Team. // Licensed under MulanPubL-2.0. // You may obtain a copy at: http://license.coscl.org.cn/MulanPubL-2.0 // THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND. // main 包:SRemoteConnectClient 主入口,负责 UAC 提权、启动 EasyTier 子进程、系统托盘管理。 package main import ( "os" "os/exec" "github.com/getlantern/systray" ) // proc 保存 EasyTier 子进程的引用,用于退出时清理。 var proc *os.Process = nil // main 程序入口:初始化日志 → 隐藏控制台 → UAC 提权 → 启动 EasyTier → 系统托盘。 func main() { initLogger() log.Info().Msg("程序启动") initConsoleHwnd() hideConsoleWindow() p := NewPermission() if !p.HasUAC() { log.Warn().Msg("未检测到管理员权限,尝试提权运行") p.runSelfAsAdmin() return } log.Info().Msg("管理员权限已确认") log.Info().Msg("开始连接虚拟热点") proc = connectToVirtualHotspot() defer cleanup() log.Info().Msg("启动系统托盘") systray.Run(onReady, onExit) } // onReady 系统托盘就绪回调:设置图标、工具提示、构建右键菜单、注册各菜单项的点击事件。 func onReady() { log.Info().Msg("系统托盘就绪") icon := loadIcon() systray.SetIcon(icon) systray.SetTooltip("若一切正常,您现可连接到SCU的所有队内服务") mTitle := systray.AddMenuItem("<<*>> SCU Remote Connect Client", "已连接") mTitle.Disable() systray.AddSeparator() mQuit := systray.AddMenuItem("退出", "退出程序,关闭现有连接") mVisitGitea := systray.AddMenuItem("访问代码托管服务 Gitea", "SASWE 代码托管服务") mVisitCloudreve := systray.AddMenuItem("访问文件分发服务 Cloudreve", "SASWE 小文件分发服务") systray.AddSeparator() mShowConsoleWindow := systray.AddMenuItem("显示控制台窗口", "调试用") mHideConsoleWindow := systray.AddMenuItem("隐藏控制台窗口", "调试用") // 退出按钮 → 调用 systray.Quit() 触发 onExit go func() { <-mQuit.ClickedCh log.Info().Msg("用户点击退出") systray.Quit() }() // 访问 Gitea → 浏览器打开 SASWE 代码托管 go func() { for range mVisitGitea.ClickedCh{ log.Info().Msg("用户点击访问 Gitea") exec.Command("cmd", "/c", "start", "http://103.217.186.98:3000/").Start()} }() // 访问 Cloudreve → 浏览器打开 SASWE 文件分发 go func() { for range mVisitCloudreve.ClickedCh{ log.Info().Msg("用户点击访问 Cloudreve") exec.Command("cmd", "/c", "start", "http://103.217.186.98:5212/").Start() }() // 显示控制台 → 调用 showConsoleWindow() go func() { for range mShowConsoleWindow.ClickedCh { log.Info().Msg("用户点击显示控制台窗口") showConsoleWindow() } }() // 隐藏控制台 → 调用 hideConsoleWindow() go func() { for range mHideConsoleWindow.ClickedCh { log.Info().Msg("用户点击隐藏控制台窗口") hideConsoleWindow() } }() } // onExit 系统托盘退出回调:清理子进程并记录退出日志。 func onExit() { cleanup() log.Info().Msg("程序退出") } // cleanup 终止 EasyTier 子进程,防止残留进程占用端口。 func cleanup() { if proc != nil { log.Info().Int("pid", proc.Pid).Msg("终止 EasyTier 进程") if err := proc.Kill(); err != nil { log.Warn().Err(err).Msg("终止 EasyTier 进程失败") } } }