// 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. // console_windows 模块:通过 WinAPI(GetConsoleWindow + ShowWindowAsync)控制控制台窗口的显示/隐藏。 package console import ( "syscall" "github.com/rs/zerolog/log" ) // 预加载 WinAPI 所需的 DLL 和函数。 var ( kernel32 = syscall.NewLazyDLL("kernel32.dll") user32 = syscall.NewLazyDLL("user32.dll") getConsoleWindow = kernel32.NewProc("GetConsoleWindow") showWindowAsync = user32.NewProc("ShowWindowAsync") ) // ShowWindow 常量。 const ( SW_HIDE = 0 // 隐藏窗口 SW_SHOW = 5 // 显示窗口 ) // cachedConsoleHwnd 在 initConsoleHwnd() 中缓存,避免 systray.Run() 后 GetConsoleWindow 返回 0。 var cachedConsoleHwnd uintptr // initConsoleHwnd 在 main() 中提前调用,缓存控制台窗口句柄。 func initConsoleHwnd() { hwnd, _, _ := getConsoleWindow.Call() cachedConsoleHwnd = hwnd } // hideConsoleWindow 隐藏控制台窗口。若无控制台则无操作。 func hideConsoleWindow() { if cachedConsoleHwnd != 0 { showWindowAsync.Call(cachedConsoleHwnd, SW_HIDE) log.Debug().Msg("控制台窗口已隐藏") } } // showConsoleWindow 显示控制台窗口。若无控制台则无操作。 func showConsoleWindow() { if cachedConsoleHwnd != 0 { showWindowAsync.Call(cachedConsoleHwnd, SW_SHOW) log.Debug().Msg("控制台窗口已显示") } }