首页 >后端开发 >Golang >如何从使用 `-ldflags -H=windowsgui` 编译的 Go GUI 应用程序打印到命令行窗口?

如何从使用 `-ldflags -H=windowsgui` 编译的 Go GUI 应用程序打印到命令行窗口?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-03 20:25:12730浏览

How to Print to the Command Window from a Go GUI Application Compiled with `-ldflags -H=windowsgui`?

如何将使用 -ldflags 编译的 GUI 应用程序的输出打印到命令行窗口 -H=windowsgui

使用 -ldflags 编译 Go 应用程序 - H=windowsgui 用作图形用户界面 (GUI) 可能会给将输出打印到命令窗口带来挑战。这是因为 Windows 上的 GUI 进程通常不与控制台关联。

问题

当使用 -H=windowsgui 标志编译应用程序时,尝试打印使用 println 或 fmt.Println 等标准方法进行输出会导致命令中不显示任何内容window.

解决方案

要在这种情况下打印输出,您需要将进程显式附加到其父进程的控制台。这可以使用 AttachConsole API 函数来实现,该函数可通过系统调用包访问:

package main

import (
    "fmt"
    "syscall"
)

const (
    ATTACH_PARENT_PROCESS = ^uint32(0) // (DWORD)-1
)

var (
    modkernel32 = syscall.NewLazyDLL("kernel32.dll")

    procAttachConsole = modkernel32.NewProc("AttachConsole")

)

func AttachConsole(dwParentProcess uint32) (ok bool) {
    r0, _, _ := syscall.Syscall(procAttachConsole.Addr(), 1, uintptr(dwParentProcess), 0, 0)
    ok = bool(r0 != 0)
    return
}

func main() {
    ok := AttachConsole(ATTACH_PARENT_PROCESS)
    if ok {
        fmt.Println("Okay, attached")
    }
}

在尝试打印输出之前调用 AttachConsole(ATTACH_PARENT_PROCESS),这会将进程连接到父控制台。完成此步骤后,您可以照常使用标准打印方法。

其他选项

如果 AttachConsole 失败,您可以考虑以下替代方案:

  • 使用 AllocConsole() 创建一个控制台窗口:这将创建一个新的控制台窗口用于该过程,但可能不适合显示版本号等简短信息。
  • 使用 GUI 对话框: 在图形用户界面对话框中显示信息,该对话框可以提供更干净的用户体验,并将信息与 GUI 应用程序更自然地关联起来。

以上是如何从使用 `-ldflags -H=windowsgui` 编译的 Go GUI 应用程序打印到命令行窗口?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn