Files
multica/server/internal/util/proc_windows.go
2026-05-11 14:45:54 +08:00

37 lines
1.2 KiB
Go

//go:build windows
package util
import "syscall"
var (
kernel32 = syscall.NewLazyDLL("kernel32.dll")
user32 = syscall.NewLazyDLL("user32.dll")
procAllocConsole = kernel32.NewProc("AllocConsole")
procGetConsoleWnd = kernel32.NewProc("GetConsoleWindow")
procShowWindow = user32.NewProc("ShowWindow")
)
const swHide = 0
// EnsureHiddenConsole guarantees the daemon owns a console that is not
// visible to the user. Every child process (git, cmd, etc.) inherits this
// hidden console automatically, so no per-call SysProcAttr gymnastics are
// needed.
//
// MUST be called at daemon startup before any child process is spawned —
// the inherited hidden console only protects children started after this
// returns. A child spawned earlier will allocate its own visible console
// window and reintroduce the popup-flash regression from #2357.
func EnsureHiddenConsole() {
if hwnd, _, _ := procGetConsoleWnd.Call(); hwnd != 0 {
return // already have a console
}
if r, _, _ := procAllocConsole.Call(); r == 0 {
return // AllocConsole failed
}
if hwnd, _, _ := procGetConsoleWnd.Call(); hwnd != 0 {
procShowWindow.Call(hwnd, swHide)
}
}