使用golang代码关闭窗口

时间:2016-09-20 13:19:09

标签: windows go shutdown

我正在制作一个程序,为我自动完成一些繁琐的任务,程序完成后我想关闭windows。我知道这可以在例如C#

中完成

如何使用golang关闭窗口?

2 个答案:

答案 0 :(得分:9)

syscall包中没有“关闭操作系统”功能,因为所有操作系统都没有提供通用接口。

注意:有一个syscall.Shutdown()函数,但这是shutdown a socket,而不是关闭操作系统。

最简单的方法是使用shutdown包执行os/exec命令,例如

if err := exec.Command("cmd", "/C", "shutdown", "/s").Run(); err != nil {
    fmt.Println("Failed to initiate shutdown:", err)
}

上面的命令启动一个关闭序列,通常需要1分钟来真正关闭系统(并且有空间用shutdown /a中止它)。您可以为shutdown命令提供不同的参数,使其不等待1分钟,但立即继续:shutdown /t 0 /s(执行shutdown /?以获取所有选项的列表)。

还有一个关闭系统的Windows API调用:ExitWindowsEx()。它有2个参数,第一个是定义关闭类型的标志(0x08表示Shuts down the system and turns off the power.),第二个是提供关闭的原因。要从Go调用它,你可以这样做:

user32 := syscall.MustLoadDLL("user32")
defer user32.Release()

exitwin := user32.MustFindProc("ExitWindowsEx")

r1, _, err := exitwin.Call(0x08, 0)
if r1 != 1 {
    fmt.Println("Failed to initiate shutdown:", err)
}

但是知道您需要SE_SHUTDOWN_NAME权限才能调用ExitWindowsEx(),否则会收到如下错误消息:

Failed to initiate shutdown: A required privilege is not held by the client.

请参阅此示例how to acquire the required privilege

答案 1 :(得分:2)

感谢您的帖子,非常有帮助。 这是执行重启的完整功能。它完全遵循前面提到的Microsoft示例。应该有助于节省时间找出结构:

ConstraintLayout