mirror of
https://github.com/ayflying/p2p.git
synced 2026-03-04 17:29:22 +00:00
增加关闭窗口不退出程序
This commit is contained in:
@@ -17,16 +17,24 @@ import (
|
|||||||
|
|
||||||
// 引入 Windows API 函数
|
// 引入 Windows API 函数
|
||||||
var (
|
var (
|
||||||
user32 = syscall.NewLazyDLL("user32.dll")
|
user32 = syscall.NewLazyDLL("user32.dll")
|
||||||
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
||||||
showWindow = user32.NewProc("ShowWindow")
|
showWindow = user32.NewProc("ShowWindow")
|
||||||
getConsoleWnd = kernel32.NewProc("GetConsoleWindow")
|
getConsoleWnd = kernel32.NewProc("GetConsoleWindow")
|
||||||
freeConsole = kernel32.NewProc("FreeConsole")
|
freeConsole = kernel32.NewProc("FreeConsole")
|
||||||
attachConsole = kernel32.NewProc("AttachConsole")
|
attachConsole = kernel32.NewProc("AttachConsole")
|
||||||
allocConsole = kernel32.NewProc("AllocConsole")
|
allocConsole = kernel32.NewProc("AllocConsole")
|
||||||
|
setConsoleCtrlHandler = kernel32.NewProc("SetConsoleCtrlHandler")
|
||||||
|
consoleCtrlHandler uintptr
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ctrlCloseEvent = 2
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *sOS) start() {
|
func (s *sOS) start() {
|
||||||
|
// 注册控制台关闭事件处理:点击叉叉仅隐藏控制台而不退出程序
|
||||||
|
s.setupConsoleCloseHandler()
|
||||||
|
|
||||||
// 系统托盘初始化(设置图标、右键菜单)
|
// 系统托盘初始化(设置图标、右键菜单)
|
||||||
go systray.Run(s.onSystrayReady, s.onSystrayExit)
|
go systray.Run(s.onSystrayReady, s.onSystrayExit)
|
||||||
@@ -34,7 +42,7 @@ func (s *sOS) start() {
|
|||||||
|
|
||||||
// 系统托盘初始化(设置图标、右键菜单)
|
// 系统托盘初始化(设置图标、右键菜单)
|
||||||
func (s *sOS) onSystrayReady() {
|
func (s *sOS) onSystrayReady() {
|
||||||
s.hideConsole()
|
// s.hideConsole()
|
||||||
var iconByte []byte
|
var iconByte []byte
|
||||||
if !gfile.Exists(s.systray.Icon) {
|
if !gfile.Exists(s.systray.Icon) {
|
||||||
iconByte = gres.GetContent(s.systray.Icon)
|
iconByte = gres.GetContent(s.systray.Icon)
|
||||||
@@ -94,9 +102,7 @@ func (s *sOS) update(version, server string) {
|
|||||||
|
|
||||||
// 隐藏控制台窗口
|
// 隐藏控制台窗口
|
||||||
func (s *sOS) hideConsole() {
|
func (s *sOS) hideConsole() {
|
||||||
// 彻底脱离控制台,避免仅最小化
|
// 仅隐藏控制台窗口(保留现有缓冲区以便后续显示时保留历史日志)
|
||||||
freeConsole.Call()
|
|
||||||
// 获取当前控制台窗口句柄并隐藏窗口
|
|
||||||
hWnd, _, _ := getConsoleWnd.Call()
|
hWnd, _, _ := getConsoleWnd.Call()
|
||||||
if hWnd != 0 {
|
if hWnd != 0 {
|
||||||
// SW_HIDE = 0:隐藏窗口
|
// SW_HIDE = 0:隐藏窗口
|
||||||
@@ -124,3 +130,25 @@ func (s *sOS) showConsole() {
|
|||||||
showWindow.Call(hWnd, 5)
|
showWindow.Call(hWnd, 5)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 注册控制台关闭事件处理器,将关闭事件转换为隐藏行为
|
||||||
|
func (s *sOS) setupConsoleCloseHandler() {
|
||||||
|
if consoleCtrlHandler != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
consoleCtrlHandler = syscall.NewCallback(func(ctrlType uint32) uintptr {
|
||||||
|
if ctrlType == ctrlCloseEvent {
|
||||||
|
// 用户点击控制台窗口的关闭按钮(X):仅隐藏,不退出
|
||||||
|
hWnd, _, _ := getConsoleWnd.Call()
|
||||||
|
if hWnd != 0 {
|
||||||
|
// SW_HIDE = 0
|
||||||
|
showWindow.Call(hWnd, 0)
|
||||||
|
}
|
||||||
|
// 返回 TRUE 表示事件已处理,阻止默认终止行为
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
// 其他事件交由系统默认处理
|
||||||
|
return 0
|
||||||
|
})
|
||||||
|
setConsoleCtrlHandler.Call(consoleCtrlHandler, uintptr(1))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user