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