diff --git a/internal/telemetry/detach_windows.go b/internal/telemetry/detach_windows.go index eb610163b..c4d62b307 100644 --- a/internal/telemetry/detach_windows.go +++ b/internal/telemetry/detach_windows.go @@ -10,7 +10,15 @@ import ( // detachAttrs returns SysProcAttr configured to place the child in its own // process group so that console signals (Ctrl+C) delivered to the parent's -// group are not forwarded to the child. +// group are not forwarded to the child, and to suppress any console window +// for the child and its descendants. +// +// CREATE_NO_WINDOW is preferred over DETACHED_PROCESS here: DETACHED_PROCESS +// removes the console entirely, which causes any console-subsystem descendant +// (e.g. tzutil.exe invoked transitively to resolve the local IANA timezone) +// to allocate a fresh conhost window, producing a visible flash on every gh +// invocation. CREATE_NO_WINDOW gives the child a non-visible console that +// descendants can inherit, avoiding the flash. func detachAttrs() *syscall.SysProcAttr { - return &syscall.SysProcAttr{CreationFlags: windows.CREATE_NEW_PROCESS_GROUP | windows.DETACHED_PROCESS} + return &syscall.SysProcAttr{CreationFlags: windows.CREATE_NEW_PROCESS_GROUP | windows.CREATE_NO_WINDOW} }