1

スクリーンセーバーが開始しようとしているときに、C++ アプリケーションで通知を受け取りたいです。一部の人々がトリックを行うべきだと考えるメッセージWM_SYSCOMMANDを聞いてみました。それはうまくいきませんでした。Spy++ は、ウィンドウがメッセージを受信して​​いないことさえ示しました。興味深いのは、モニターの電源を切ったときに、 でメッセージを受信したことです。私はそれを間違って理解していますか?それとも、何かを逃しただけですか?wParam == SC_SCREENSAVEWM_SYSCOMMANDwParam == SC_MONITORPOWER

編集: テストでは、デフォルトの Windows スクリーンセーバー (Windows のロゴが付いたもの) を使用しました。

4

3 に答える 3

1

ウィンドウにフォーカスがある場合にのみ SC_SCREENSAVE メッセージを受け取るようです。これを回避するには、グローバル フックを設定します。そのためには、コールバック関数を別の DLL に配置する必要があり、システムの速度を低下させるフックに関するこの恐ろしいメッセージもあるため、スクリーンセーバーの開始に応答するという考えをやめることにしました。

于 2010-02-12T13:15:00.267 に答える
0

これは比較的複雑な作業です (簡単にできればいいのですが)。

オンラインで見つけられるこれらのテストの一部は、ウィンドウにフォーカスがある場合にのみ機能します。バックグラウンドで実行されている場合、そのようなメッセージを受信しない場合があります。

他のテストは、実行中のスクリーンセーバー プログラムに依存しますが (現在設定されているスクリーンセーバーを確認し、プロセス リストを監視してアクティブかどうかを確認します)、省電力モードに移行したり、スクリーンセーバーが黒い画面 (つまり、プログラムなし、モニターオフのみ)。

これを行うための理想的な方法があるとは思いません。最初に戻って、なぜこの状態を検出する必要があるのか​​、何を達成しようとしているのかについて、より慎重に考えてみてください。別のソリューションが必要になる場合があります。

于 2010-02-01T15:11:29.347 に答える
0

おそらく私の答えは遅すぎます。

MSDN は、「レガシー」の下でスクリーンセーバーを処理します。ノートブックではバッテリーを浪費し、PC でも役に立ちません。スクリーンセーバーを表示させるよりも、モニターをオフにすることをお勧めします。

やりたいことを正確に説明していないので、セーバーが開始する前に通知が本当に必要なのか、それとも開始したばかりのときに通知を受け取るだけで十分なのかわかりません。

後者の場合は簡単です。定期的にチェックするスレッドを作成します。

    BOOL b_SaverRunning;
    SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &b_SaverRunning, 0);
于 2015-08-07T22:28:00.483 に答える