在Golang中使用Exec时如何隐藏命令提示符窗口?

时间:2017-02-28 05:02:30

标签: windows go command-line system-calls

说我有以下代码,使用template来隐藏命令行窗口

syscall

但是当我编译它并试图在Windows中运行它时,命令行窗口再次显示

如何防止命令行窗口出现?

PS我已经知道如何使用process := exec.Command(name, args...) process.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} err := process.Start() if err != nil { log.Print(err) } 将golang源编译成Windows GUI可执行文件,但这样做只能确保程序本身不会显示命令行窗口,go build -ldflags -H=windowsgui将无论如何都要展示那些窗户

3 个答案:

答案 0 :(得分:10)

There是一个更好的解决方案,它可以运行exec.Command()而不会产生可见窗口,(͡°͜ʖ͡°)。

这是我的代码:

首先import "syscall"

cmd_path := "C:\\Windows\\system32\\cmd.exe"
cmd_instance := exec.Command(cmd_path, "/c", "notepad")
cmd_instance.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
cmd_output, err := cmd_instance.Output()

产地: https://www.reddit.com/r/golang/comments/2c1g3x/build_golang_app_reverse_shell_to_run_in_windows/

答案 1 :(得分:3)

如果使用-ldflags -H=windowsgui构建,则每个exec.Command都会生成一个新的控制台窗口。

如果您在没有标志的情况下构建,则会获得一个控制台窗口,并且所有exec.Commands都会打印到该窗口。

我当前的解决方案是构建不带标志,即在程序启动时有一个控制台窗口,然后在我的程序开始时立即用这段代码隐藏控制台窗口:

import "github.com/gonutz/ide/w32"

func hideConsole() {
    console := w32.GetConsoleWindow()
    if console == 0 {
        return // no console attached
    }
    // If this application is the process that created the console window, then
    // this program was not compiled with the -H=windowsgui flag and on start-up
    // it created a console along with the main application window. In this case
    // hide the console window.
    // See
    // http://stackoverflow.com/questions/9009333/how-to-check-if-the-program-is-run-from-a-console
    _, consoleProcID := w32.GetWindowThreadProcessId(console)
    if w32.GetCurrentProcessId() == consoleProcID {
        w32.ShowWindowAsync(console, w32.SW_HIDE)
    }
}

有关进程ID的详细信息,请参阅this thread

现在,所有exec.Commands都会将其输出打印到隐藏的控制台窗口,而不是自己生成。

这里的妥协是你的程序在你启动它时会闪一个控制台窗口,但只是在它隐藏之前的短暂时间。

答案 2 :(得分:0)

代替隐藏控制台窗口,您应该能够通过以下方法阻止它:

cmd := exec.Command(...)
cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x08000000} // CREATE_NO_WINDOW