環境はWinXP VisualStudio.NET2003 VC++ MFC です。
ダイアログにボタンを置きます。
ボタンを押すとパソコンをシャットダウンするようにしたいのですが、どうすればできま
すか?
この質問はボタンを配置する方法ですか?
それともシャットダウンの方法ですか?
シャットダウンの方法なら
http://shoppers-jp.com/tech/sdk031.html
http://www.runan.net/program/tips/sdk_13_ExitWindowsEx.shtml
ここを参考にしましょう。
私の場合、こんな感じでやってます(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;
}
WindowsAPIサンプルって書いてあるのですがMFCと同じ意味ですか?
MFCというのはC++でWindowsAPIを使いやすくしたクラスライブラリです。
意味的にはWindowsAPI≠MFCですがMFCでもWindowsAPIを呼び出せます。
メンバ関数と区別できるようにbunさんのように::を関数名に付ければいい。
EWX_POWEROFFとEWX_SHUTDOWNの違いは何ですか?
昔のパソコンでは、OS をシャットダウンした後、電源が勝手に切れなかったんです。
「OS のシャットダウン」とは「OS を停止して、PC の電源を切れる状態にする」という
意味で、その頃は電源を手動で切る必要があったんです。
その後、自動で電源を切る機能を搭載した PC が登場したため、EWX_SHUTDOWN は前述の
意味での「電源を切れる状態にすること」、EWX_POWEROFF は、「自動的に電源を切るこ
と」と分けられています。
なお、Windows XP SP1 以降では、EWX_SHUTDOWN でも自動的に電源が切れるため、これら
に差はありません。
# というか、EWX_SHUTDOWN でも電源が切れるようになったのって最近なのね。
下記のようにして動くようになりました。
ありがとうございました。
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);