2016-09-20 246 views
3

我正在制作一个程序,在程序完成后自动执行一些繁琐的任务,我想关闭窗口。我知道这可以在例如C#中完成。#使用golang代码关闭窗口

如何使用golang关闭窗口?

+1

https://golang.org/pkg/syscall/#Shutdown? –

+1

@u_mulder我不这么认为。 ['syscall.Shutdown()'](https://golang.org/pkg/syscall/#Shutdown)是[关闭套接字](https://msdn.microsoft.com/en-us/library/windows /desktop/ms740481(v=vs.85).aspx),而不是操作系统。 – icza

回答

7

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

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

最简单的方法就是使用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.),第二个是提供关机的原因。从去调用该方法,可以是这样做的:

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