プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

Windows の終了/再起動/ログオフ

2007年11月28日 16時13分00秒 | システム関連

Windows の終了(シャットダウン)、再起動、ログオフするには次の手順で行います。(戻る)

  1. 終了、再起動、ログオフさせるために SE_SHUTDOWN_NAME 特権を有効にする(ProcessPrivilegeName)
  2. 終了、再起動、ログオフさせるAPIを呼び出す(ExitWindowsEx)

Windows 95/98/Me では(1)の特権を有効にする必要はありません。

プロトタイプ宣言

HANDLE GetCurrentProcess( VOID );

BOOL ExitWindowsEx(
    UINT    uFlags,         // シャットダウン操作
    DWORD   dwReserved      // 予約済み
);

サンプル

#include <stdio.h>
#include <windows.h>

// メイン関数
int main( void )
{
    UINT uFlag = 0;
    UINT uMenu;
    
    do {
        printf( TEXT("\n") );
        printf( TEXT("1...ログオフ\n") );
        printf( TEXT("2...パワーオフ\n") );
        printf( TEXT("3...再起動\n") );
        printf( TEXT("4...シャットダウン\n") );
        scanf(  TEXT("%d"), &uMenu );
        
        switch ( uMenu ){
            case 1:     uFlag = EWX_LOGOFF;     break;
            case 2:     uFlag = EWX_POWEROFF;   break;
            case 3:     uFlag = EWX_REBOOT;     break;
            case 4:     uFlag = EWX_SHUTDOWN;   break;
            default:    uMenu = 0;              break;
        }
    } while ( uMenu == 0 );
    
    // Windows NT 系のために SE_SHUTDOWN_NAME 特権を有効にする
    ProcessPrivilegeName( GetCurrentProcess(), SE_SHUTDOWN_NAME, TRUE );
    // ログオフ/パワーオフ/再起動/シャットダウンを実行する
    ExitWindowsEx( uFlag, 0 );
    return 0;
}
  • Windows 95/98/Me では SE_SHUTDOWN_NAME 特権を有効にする必要はありません。
  • Windows 95/98 ではコンソール・アプリケーションから ExitWindowEx 関数を呼び出しても失敗します。
  • ProcessPrivilegeName 関数は前回紹介した自作関数です。(API関数ではありません)

補足情報

  • EWX_FORCE 定数をフラグに追加すると強制的にログオフ/パワーオフ/再起動/シャットダウンを行えます。
  • なお、本当に強制的に終了するのでアプリケーションで、まだ保存されていないデータは失われます。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 指定した特権名の有効/無効 | トップ | Windows の休止状態/スタンバイ »
最新の画像もっと見る

コメントを投稿

システム関連」カテゴリの最新記事