novaの日記: ExitWindowsEx
BCB6 で Windows を落す方法
API 使うので BCB6 限定じゃないですけど。
ExitWindowsEx(EWX_SHUTDOWN, 0);
第一引数のキーワードで落し方が換えられるみたい。
-
EWX_LOGOFF : ログオフ。
-
EWX_POWEROFF : シャットダウン後、電源断。
-
EWX_REBOOT : 再起動。
-
EWX_SHUTDOWN : シャットダウン後、電源を切れる状態にする。 ATX 電源だと EWX_POWEROFF と同じ動きになる。
-
EWX_FORCE : プロセスを問答無用で強制終了。単体だとログオフします。
EWX_FORCE を他のキーワードと併用する場合は OR (|) で繋ぎます。
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
ただし、NT カーネルの Windows の場合、EWX_LOGOFF 以外は権限の設定が必要らしいです。 権限設定のソースをパチってきたら普通に動きました。
//form に TButton x1, TRadioButton x5 を設置。
void __fastcall TmainForm::execClick(TObject *Sender)
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tokenPrivileges;
//アクセストークンをオープンする
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){
if(LookupPrivilegeValue("", SE_SHUTDOWN_NAME, &luid)){
//SE_SHUTDOWN_NAME 特権を有効にする
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Luid = luid;
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, NULL, NULL, NULL);
if(GetLastError() == ERROR_SUCCESS){
//windows の終了。
if(LOGOFF->Checked == true)ExitWindowsEx(EWX_LOGOFF, 0);
if(POWEROFF->Checked == true)ExitWindowsEx(EWX_POWEROFF, 0);
if(REBOOT->Checked == true)ExitWindowsEx(EWX_REBOOT, 0);
if(SHUTDOWN->Checked == true)ExitWindowsEx(EWX_SHUTDOWN, 0);
if(FORCE->Checked == true)ExitWindowsEx(EWX_FORCE, 0);
}
CloseHandle(hToken);
}
}
}
//---------------------------------------------------------------------------
ExitWindowsEx More ログイン