1

継承したクラスを作成しCWinApp、このクラスにタイマーがあります(ウィンドウタイマーを使用)。

PCがスリープモードになってウェイクアップすると、タイマーコールバックはウェイクアップの正確な時刻と呼ばれます。PCがサスペンドから再開するときにタイマーコールバックを呼び出さないようにしたい。

そこでWM_POWERBROADCASTメッセージを使ってみました。PreTranslateMessage()しかし、このメッセージはAPIではキャッチされませんでした。SetWindowLong()また、私は自分のAPIで 試しましたが、それでもWM_POWERBROADCASTメッセージをキャッチできませんでした。

入る方法はありますWM_POWERBROADCASTCWinApp

4

2 に答える 2

2

Visual Studio C++ MFC アプリケーションでは、次の例のように、メッセージON_MESSAGE()を探してメッセージ マップにを追加する必要があります。WM_POWERBROADCAST

BEGIN_MESSAGE_MAP(CFrameworkWndApp, CWinApp)
    //{{AFX_MSG_MAP(CFrameworkWndApp)
    ON_WM_CHAR()
    ON_WM_TIMER()
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_POWERBROADCAST, OnPowerMsgRcvd)
END_MESSAGE_MAP()

wParam次に、このスケルトンのようにメッセージ タイプの変数を確認できるように、クラス定義の変更と共にメッセージ ハンドラー関数を追加して、メッセージ ハンドラーのメンバー関数を宣言する必要があります。LRESULTメッセージを処理したかどうかを示す値を返すことを忘れないでください。

// Handle the WM_POWERBROADCAST message to process a message concerning power management
// such as going to Sleep or Waking Up.
LRESULT CFrameworkWndApp::OnPowerMsgRcvd(WPARAM wParam, LPARAM lParam)
{
    LRESULT  lrProcessed = 0;  // indicate if message processed or not

    switch (wParam) {
        case PBT_APMPOWERSTATUSCHANGE:
            TRACE0("PBT_APMPOWERSTATUSCHANGE  received\n");
            break;
        case PBT_APMRESUMEAUTOMATIC:
            TRACE0("PBT_APMRESUMEAUTOMATIC  received\n");
            break;
        case PBT_APMRESUMESUSPEND:
            TRACE0("PBT_APMRESUMESUSPEND  received\n");
            break;
        case PBT_APMSUSPEND:
            TRACE0("PBT_APMSUSPEND  received\n");
            break;
    }

    // indicate if framework needs to handle message or we did ourselves.
    return lrProcessed;
}

メッセージの処理の詳細については、 Microsoft のドキュメント - Power Managementおよびそのドキュメントの特定のサブセクションMicrosoft のドキュメント - WM_POWERBROADCAST メッセージを参照してください。

Windows がアプリケーションがアクティブかどうか、およびスリープ モードに入る必要があるかどうかを判断する方法に影響を与えるSetThreadExecutionState() 関数も参照してください。

次のスタック オーバーフローの投稿も参照してください。

于 2015-06-25T00:48:35.797 に答える
0

Windows メッセージです。すべてのトップレベル ウィンドウに送信されます。したがって、このメッセージをキャッチするには、メイン ウィンドウでハンドラーを作成します。

于 2013-02-08T04:35:18.630 に答える