Windowsをシャットダウンするには

Windowsをシャットダウンさせるには、二つ方法があります。
そのうち、一番手抜きなのが、シェルのシャットダウンダイアログを表示させる方法です。

//SHExitWindowsDialog
PostMessage(FindWindow("ProgMan", NULL), WM_CLOSE, 0, 0);

C言語ならこの一行でできてしまいます。
ひまわりだと、
'シャットダウンダイアログ表示
DLLを利用("user32", "void PostMessageA(DWORD,DWORD,DWORD,DWORD)", "?,?,?,?", "PostMessage");
PostMessage(窓ハンドル検索("ProgMan"), $10, 0, 0);

となります。


まっとうな手段として、ExitWindowsExを使う方法がありますが、これは(準備段階が複雑すぎて)ひまわりでは使えません。
代わりに、最近のひまわりでは'WINDOWS終了' 'WINDOWS再起動'といった命令が実装されています。
C言語では、

//ShutDown
void ShutDown(DWORD dwShutdownFlag){
    DWORD ret;
    HANDLE hProcess, hToken;
    LUID Luid;
    TOKEN_PRIVILEGES pre, new;

    hProcess = GetCurrentProcess();
    OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken);
    LookupPrivilegeValue(NULL, lpName, &Luid);

    new.PrivilegeCount = 1;
    new.Privileges[0].Luid = Luid;
    new.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

 AdjustTokenPrivileges(hToken, FALSE, &new, sizeof(TOKEN_PRIVILEGES), &pre, &ret);

 ExitWindowsEx(dwShutdownFlag, 0);
}

となります。
また、Adjust...までの部分はNT系でのみ必要になるコードなので、実際はGetVersionExあたりで条件分岐してください。


番外編 休止状態・スタンバイにする

プログラムからWindowsを休止状態・スタンバイにするには、ExitWindowsExではなく、SetSystemPowerStateを使用します。

'WINDOWS休止
DLLを利用("kernel32", "int SetSystemPowerState(int,int)", "?,?", "SetSystemPowerState");
SetSystemPowerState(0,0);

'WINDOWSスタンバイ
DLLを利用("kernel32", "int SetSystemPowerState(int,int)", "?,?", "SetSystemPowerState");
SetSystemPowerState(1,0);

たったこれだけです。ちなみに、休止状態・スタンバイがサポートされていない場合、当然関数は失敗します。