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

127 lines
3.1 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"
"github.com/gogf/gf/v2/os/gres"
)
// 引入 Windows API 函数
var (
user32 = syscall.NewLazyDLL("user32.dll")
kernel32 = syscall.NewLazyDLL("kernel32.dll")
showWindow = user32.NewProc("ShowWindow")
getConsoleWnd = kernel32.NewProc("GetConsoleWindow")
freeConsole = kernel32.NewProc("FreeConsole")
attachConsole = kernel32.NewProc("AttachConsole")
allocConsole = kernel32.NewProc("AllocConsole")
)
func (s *sOS) start() {
// 系统托盘初始化(设置图标、右键菜单)
go systray.Run(s.onSystrayReady, s.onSystrayExit)
}
// 系统托盘初始化(设置图标、右键菜单)
func (s *sOS) onSystrayReady() {
s.hideConsole()
var iconByte []byte
if !gfile.Exists(s.systray.Icon) {
iconByte = gres.GetContent(s.systray.Icon)
gfile.PutBytes(s.systray.Icon, iconByte)
}
iconByte = gfile.GetBytes(s.systray.Icon)
//if gres.Contains(s.systray.Icon) {
// iconByte = gres.GetContent(s.systray.Icon)
// gfile.PutBytes(s.systray.Icon, iconByte)
//} else {
// 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() {
// 彻底脱离控制台,避免仅最小化
freeConsole.Call()
// 获取当前控制台窗口句柄并隐藏窗口
hWnd, _, _ := getConsoleWnd.Call()
if hWnd != 0 {
// SW_HIDE = 0隐藏窗口
showWindow.Call(hWnd, 0)
}
}
// 显示控制台窗口
func (s *sOS) showConsole() {
// 获取当前控制台窗口句柄
hWnd, _, _ := getConsoleWnd.Call()
if hWnd == 0 {
// 如果当前进程没有控制台,尝试附加到父进程控制台
// ATTACH_PARENT_PROCESS = (DWORD)-1
ret, _, _ := attachConsole.Call(uintptr(^uint32(0)))
if ret == 0 {
// 附加失败则分配一个新的控制台窗口
allocConsole.Call()
}
// 重新获取控制台窗口句柄
hWnd, _, _ = getConsoleWnd.Call()
}
if hWnd != 0 {
// SW_SHOW = 5显示窗口
showWindow.Call(hWnd, 5)
}
}