シャットダウンの方法

[戻る]
nepiaa 2008/07/05(土) 10:32:30
環境はWinXP VisualStudio.NET2003 VC++ MFC です。

ダイアログにボタンを置きます。
ボタンを押すとパソコンをシャットダウンするようにしたいのですが、どうすればできま
すか?

金魚ちゃん 2008/07/05(土) 14:12:39
この質問はボタンを配置する方法ですか?
それともシャットダウンの方法ですか?

シャットダウンの方法なら
http://shoppers-jp.com/tech/sdk031.html
http://www.runan.net/program/tips/sdk_13_ExitWindowsEx.shtml
ここを参考にしましょう。

bun 2008/07/05(土) 14:14:16
私の場合、こんな感じでやってます(Win95系のOSでも動作します)。
おまけで、スタンバイ/休止状態のコードもつけておきました。

// プロセスにスタンバイ/休止状態/シャットダウンの特権を与える
BOOL bPrivilegeOn = FALSE;
HANDLE hToken = NULL;
if(::OpenProcessToken(    // 特権を作成
    ::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
    LUID Id;
    if(::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &Id))
    {
        // プロセスに特権を与える
        TOKEN_PRIVILEGES tkp;
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Luid = Id;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        bPrivilegeOn =
            ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL);
    }
    ::CloseHandle(hToken);
}

// スタンバイ/休止状態/シャットダウンを実行
switch(m_AutoExitMode)
{
case EAM_STANDBY:    // スタンバイ状態にする
    if(!::SetSystemPowerState(TRUE, FALSE))
    {
        AfxMessageBox("スタンバイ状態にできませんでした。");
    }
    break;
case EAM_SLEEP:        // 休止状態にする
    if(!::SetSystemPowerState(FALSE, FALSE))
    {
        AfxMessageBox("休止状態にできませんでした。");
    }
    break;
case EAM_SHUTDOWN:    // シャットダウンする
    if(!::ExitWindowsEx(bPrivilegeOn ? EWX_POWEROFF : EWX_SHUTDOWN, 0))
    {
        AfxMessageBox("シャットダウンできませんでした。");
    }
    break;
default:
    break;
}

nepiaa 2008/07/05(土) 17:31:01
WindowsAPIサンプルって書いてあるのですがMFCと同じ意味ですか?

金魚ちゃん 2008/07/05(土) 17:38:00
MFCというのはC++でWindowsAPIを使いやすくしたクラスライブラリです。
意味的にはWindowsAPI≠MFCですがMFCでもWindowsAPIを呼び出せます。

メンバ関数と区別できるようにbunさんのように::を関数名に付ければいい。

nepiaa 2008/07/07(月) 17:15:20
EWX_POWEROFFとEWX_SHUTDOWNの違いは何ですか?

シャノン 2008/07/07(月) 17:22:56
昔のパソコンでは、OS をシャットダウンした後、電源が勝手に切れなかったんです。
「OS のシャットダウン」とは「OS を停止して、PC の電源を切れる状態にする」という
意味で、その頃は電源を手動で切る必要があったんです。
その後、自動で電源を切る機能を搭載した PC が登場したため、EWX_SHUTDOWN は前述の
意味での「電源を切れる状態にすること」、EWX_POWEROFF は、「自動的に電源を切るこ
と」と分けられています。
なお、Windows XP SP1 以降では、EWX_SHUTDOWN でも自動的に電源が切れるため、これら
に差はありません。

# というか、EWX_SHUTDOWN でも電源が切れるようになったのって最近なのね。

nepiaa 2008/07/08(火) 15:22:45
[[解決]]
下記のようにして動くようになりました。
ありがとうございました。

DWORD ret;
    HANDLE hProcess;
    HANDLE hToken;
    LUID   Luid;
    TOKEN_PRIVILEGES tokenNew, tokenPre;

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

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

    AdjustTokenPrivileges(hToken, FALSE, &tokenNew, sizeof(tokenPre), &tokenPre,
&ret);

    ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);

古いスレッドには追加発言できません。