2016-09-20 253 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