From a4b350d2e3b59faaf2284f27527d4d7935fa9ae5 Mon Sep 17 00:00:00 2001 From: Snowflake Date: Mon, 22 Jun 2026 22:31:36 +0800 Subject: [PATCH] b1.3 Fix hide/show console window for only once. --- console_windows.go | 23 +++++++++++++++-------- main.go | 15 +++++++++------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/console_windows.go b/console_windows.go index e8320e4..9196bc4 100644 --- a/console_windows.go +++ b/console_windows.go @@ -24,20 +24,27 @@ const ( SW_SHOW = 5 // 显示窗口 ) -// hideConsoleWindow 获取当前控制台句柄并隐藏窗口。若无控制台则无操作。 -func hideConsoleWindow() { +// cachedConsoleHwnd 在 initConsoleHwnd() 中缓存,避免 systray.Run() 后 GetConsoleWindow 返回 0。 +var cachedConsoleHwnd uintptr + +// initConsoleHwnd 在 main() 中提前调用,缓存控制台窗口句柄。 +func initConsoleHwnd() { hwnd, _, _ := getConsoleWindow.Call() - if hwnd != 0 { - showWindowAsync.Call(hwnd, SW_HIDE) + cachedConsoleHwnd = hwnd +} + +// hideConsoleWindow 隐藏控制台窗口。若无控制台则无操作。 +func hideConsoleWindow() { + if cachedConsoleHwnd != 0 { + showWindowAsync.Call(cachedConsoleHwnd, SW_HIDE) log.Debug().Msg("控制台窗口已隐藏") } } -// showConsoleWindow 获取当前控制台句柄并显示窗口。若无控制台则无操作。 +// showConsoleWindow 显示控制台窗口。若无控制台则无操作。 func showConsoleWindow() { - hwnd, _, _ := getConsoleWindow.Call() - if hwnd != 0 { - showWindowAsync.Call(hwnd, SW_SHOW) + if cachedConsoleHwnd != 0 { + showWindowAsync.Call(cachedConsoleHwnd, SW_SHOW) log.Debug().Msg("控制台窗口已显示") } } diff --git a/main.go b/main.go index 11e7c0c..09d6cbf 100644 --- a/main.go +++ b/main.go @@ -21,6 +21,7 @@ func main() { initLogger() log.Info().Msg("程序启动") + initConsoleHwnd() hideConsoleWindow() p := NewPermission() @@ -83,16 +84,18 @@ func onReady() { // 显示控制台 → 调用 showConsoleWindow() go func() { - <-mShowConsoleWindow.ClickedCh - log.Info().Msg("用户点击显示控制台窗口") - showConsoleWindow() + for range mShowConsoleWindow.ClickedCh { + log.Info().Msg("用户点击显示控制台窗口") + showConsoleWindow() + } }() // 隐藏控制台 → 调用 hideConsoleWindow() go func() { - <-mHideConsoleWindow.ClickedCh - log.Info().Msg("用户点击隐藏控制台窗口") - hideConsoleWindow() + for range mHideConsoleWindow.ClickedCh { + log.Info().Msg("用户点击隐藏控制台窗口") + hideConsoleWindow() + } }() }