2

つまり、ユーザーがシャットダウンを押すと、アプリはシャットダウンをブロックし、いくつかのことを行います。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;
}
4

3 に答える 3

1

はい、シャットダウン ロジックが変更されましたが、Windows 8 では変更されていません。Vista で変更されており、変更は MSDN に記載されています。

Windows Vista でのアプリケーション シャットダウンの変更

WM_QUERYENDSESSION単純に処理するだけでは十分ではなくWM_ENDSESSION、シャットダウン プロセスと対話するための新しい API 関数が含まれています。

于 2012-12-07T01:27:11.450 に答える
1

VS2012 に含まれている新しいデバッグ プロセスを使用できます。リンクを参照してください: VS 2012 の機能のデバッグ。Windows 8 では状態が異なる方法で適用されるため、これらのデバッグ ツールが検出に役立つ問題が発生する可能性があります。うまくいけば、これはあなたにとってニュースではありません。

デバッグしている問題を示すコード サンプルを投稿できれば簡単です。

調査中、次のリンクも使用しましたが、あまり役に立たないかもしれません: WM_ENDSESSION

于 2012-12-06T17:42:53.670 に答える
-1

また、呼び出し時に提供されるカスタム文字列がShutdownBlockReasonCreate()Windows 8/8.1 で更新されないようです。最初の文字列を表示するだけで、更新はしません。シャットダウンをブロックする理由と期間をユーザーに知らせようとしています。

于 2014-07-14T11:23:30.877 に答える