Files
p2p/internal/logic/os/windows.go

99 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//go:build windows
package os
import (
"os"
"os/exec"
"syscall"
"github.com/getlantern/systray"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcmd"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/gfile"
)
// 引入 Windows API 函数
var (
user32 = syscall.NewLazyDLL("user32.dll")
kernel32 = syscall.NewLazyDLL("kernel32.dll")
showWindow = user32.NewProc("ShowWindow")
getConsoleWnd = kernel32.NewProc("GetConsoleWindow")
)
func (s *sOS) start() {
// 系统托盘初始化(设置图标、右键菜单)
go systray.Run(s.onSystrayReady, s.onSystrayExit)
}
// 系统托盘初始化(设置图标、右键菜单)
func (s *sOS) onSystrayReady() {
//s.hideConsole()
iconByte := gfile.GetBytes(s.systray.Icon)
systray.SetIcon(iconByte)
systray.SetTitle(s.systray.Title)
systray.SetTooltip(s.systray.Tooltip)
mQuit := systray.AddMenuItem("退出", "退出应用")
mShow := systray.AddMenuItemCheckbox("显示窗口", "显示窗口", false)
// Sets the icon of a menu item. Only available on Mac and Windows.
//mQuit.SetIcon(iconByte)
go func() {
for {
select {
case <-mQuit.ClickedCh:
systray.Quit()
case <-mShow.ClickedCh:
// 显示窗口
s.showConsole()
}
}
}()
}
func (s *sOS) onSystrayExit() {
// clean up here
g.Log().Debugf(gctx.New(), "系统托盘退出")
defer os.Exit(0)
}
func (s *sOS) update(version, server string) {
updaterPath := gcmd.GetArg(0).String()
// 启动更新器,传递主程序路径和当前版本作为参数
cmd := exec.Command(updaterPath, version, server)
// 将更新器与主程序的控制台分离
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: false} // Windows特定设置
if err := cmd.Start(); err != nil {
return
}
}
// 隐藏控制台窗口
func (s *sOS) hideConsole() {
// 获取当前控制台窗口句柄
hWnd, _, _ := getConsoleWnd.Call()
if hWnd == 0 {
return // 无控制台窗口如编译为GUI子系统时
}
// SW_HIDE = 0隐藏窗口
showWindow.Call(hWnd, 0)
}
// 显示控制台窗口
func (s *sOS) showConsole() {
// 获取当前控制台窗口句柄
hWnd, _, _ := getConsoleWnd.Call()
if hWnd == 0 {
return
}
// SW_SHOW = 5显示窗口
showWindow.Call(hWnd, 5)
}