//go:build windows package main // Windows-only: with -H=windowsgui the binary is registered as a GUI // subsystem app, so double-clicking from the Desktop shortcut does NOT // spawn a console window (good for the desktop UX). The downside is that // sub-commands like `muyue scan`, `muyue version`, `muyue install-shortcuts` // produce no output when invoked from cmd.exe. // // Workaround: at process start, try to attach to the parent's console via // kernel32!AttachConsole(ATTACH_PARENT_PROCESS). If the parent has a console // (i.e. we were launched from cmd.exe / PowerShell), stdout/stderr/stdin are // rebound to it. If not (Explorer double-click), the call fails silently and // the binary runs without any console — exactly what we want. import ( "log" "os" "syscall" ) const attachParentProcess = ^uint32(0) // -1 cast to DWORD func init() { kernel32, err := syscall.LoadLibrary("kernel32.dll") if err != nil { return } defer syscall.FreeLibrary(kernel32) attachConsole, err := syscall.GetProcAddress(kernel32, "AttachConsole") if err != nil { return } r0, _, _ := syscall.SyscallN(attachConsole, uintptr(attachParentProcess)) if r0 == 0 { return // parent has no console (Explorer launch) — stay silent } // Re-bind the standard streams to the freshly attached console so // fmt.Println / log output appear in the parent terminal. if h, err := syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE); err == nil && h != 0 { os.Stdout = os.NewFile(uintptr(h), "stdout") } if h, err := syscall.GetStdHandle(syscall.STD_ERROR_HANDLE); err == nil && h != 0 { os.Stderr = os.NewFile(uintptr(h), "stderr") } if h, err := syscall.GetStdHandle(syscall.STD_INPUT_HANDLE); err == nil && h != 0 { os.Stdin = os.NewFile(uintptr(h), "stdin") } // log.Default() captured the original os.Stderr at init time — repoint it // at the freshly attached console so log.Printf calls (e.g. desktop.Run) // surface in the parent terminal. log.SetOutput(os.Stderr) }