シャットダウンの方法 – プログラミング – Home

通知
すべてクリア

[解決済] シャットダウンの方法


nepiaa
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

環境はWinXP VisualStudio.NET2003 VC++ MFC です。

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


引用未解決
トピックタグ
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

この質問はボタンを配置する方法ですか?
それともシャットダウンの方法ですか?

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


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

私の場合、こんな感じでやってます(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
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

WindowsAPIサンプルって書いてあるのですがMFCと同じ意味ですか?


返信引用
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

MFCというのはC++でWindowsAPIを使いやすくしたクラスライブラリです。
意味的にはWindowsAPI≠MFCですがMFCでもWindowsAPIを呼び出せます。

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


返信引用
nepiaa
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

EWX_POWEROFFとEWX_SHUTDOWNの違いは何ですか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

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

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


返信引用
nepiaa
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

下記のようにして動くようになりました。
ありがとうございました。

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);


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました