2016-09-20 9 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パッケージには「シャットダウンOS」機能はありません。これは、すべてのオペレーティングシステムで共通のインターフェイスが提供されていないためです。

注:syscall.Shutdown()機能がありますが、これはshutdown a socketです。オペレーティングシステムをシャットダウンしないでください。

os/execパッケージを使用してshutdownコマンドを実行するのが最も簡単です。

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つのパラメータがあり、最初にシャットダウンタイプを定義するフラグ(0x08Shuts down the system and turns off the power.を意味します)、2番目はシャットダウンの理由を示すことです。この例how to acquire the required privilegeを参照してください

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

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) 
} 

しかし、あなたはExitWindowsEx()を呼び出すためのSE_SHUTDOWN_NAME特権が必要であることを知って、他のあなたのようなエラーメッセージが表示されます:ゴーからこれを呼び出すには、次のようにそれを行うことができます。

関連する問題