つまり、ユーザーがシャットダウンを押すと、アプリはシャットダウンをブロックし、いくつかのことを行います。WM_QUERYENDSESSION と WM_ENDSESSION を処理することでそれを行います。仕事は WM_ENDSESSION ハンドラで行われます。これは、Windows 7、XP で完璧に動作します。
問題は次のとおりです。Windows 8 では、約 1 分後にシャットダウン プロセスがキャンセルされます。シャットダウン UI がしばらく表示され、理由の文字列が表示された後、システムが開始画面に移動します。シャットダウンなし、何も起こりません。私のアプリはまだ実行中です。最初は私たちのアプリに問題があると思っていましたが、私たちのアプリだけでなく、すべてのアプリでシステムがそのように動作しているようです。自分で確認し、知っているアプリを実行して、シャットダウンをブロックし、シャットダウン (またはサインオフ) を行うことができます。シャットダウン UI が表示され、シャットダウンをブロックしているアプリが示されます。少し待つと、約 60 ~ 90 秒後に消えます。シャットダウンはキャンセルされます。
MSがWindows 8のシャットダウンプロセスで何かを変更したかどうか疑問に思っていますか?
編集:ここに実際のコードを投稿することはできないので、要点を説明するためにちょっと疑似コードを投稿します:
LRESULT CMainFrame::OnQueryEndSession(UINT, WPARAM , LPARAM lParam, BOOL& bHandled) {
m_bQueryEndSession = true;
bHandled = true;
return TRUE;
}
LRESULT CMainFrame::OnEndSession(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
BOOL bEnding = (BOOL)wParam;
if(!bEnding)
return 0;
if(m_bQueryEndSession && /*and some other checks*/ )
{
if (g_osver.dwMajorVersion >= 6) {
// of Vista and higher load User32.dll and call ShutdownBlockReasonCreate() here
}
{
// all important job is done here
// zzz
}
if (g_osver.dwMajorVersion >= 6) {
// of Vista and higher load User32.dll and call ShutdownBlockDestroy() here
}
}
bHandled = true;
return 0;
}