//go:build windows package hotime import ( "syscall" "time" ) var kernel32 = syscall.NewLazyDLL("kernel32.dll") var procSetConsoleCtrlHandler = kernel32.NewProc("SetConsoleCtrlHandler") // registerWindowsCloseHandler 注册 Windows 控制台关闭事件处理器, // 捕获用户点击控制台 X 按钮、系统注销/关机等事件,触发优雅停机。 // // Windows 在 CTRL_CLOSE_EVENT 后约 5 秒会强制结束进程, // 因此此路径使用更短的 drain(2s)+shutdown(3s),总计 <5s。 // 对于需要更长时间的场景,请改用 taskkill /PID 或 Ctrl+C。 func (that *Application) registerWindowsCloseHandler() { handler := func(ctrl uintptr) uintptr { switch ctrl { case 2, 5, 6: // CTRL_CLOSE_EVENT=2, CTRL_LOGOFF_EVENT=5, CTRL_SHUTDOWN_EVENT=6 that.initiateGracefulShutdown(2*time.Second, 3*time.Second) time.Sleep(6 * time.Second) return 1 // TRUE, 已处理 } return 0 // FALSE, 交给下一个 handler } procSetConsoleCtrlHandler.Call(syscall.NewCallback(handler), 1) }