1

ログインしているユーザーのコンテキストで、Windows プラットフォームのローカル サービスから実行できるこのユーザー モード実行可能ファイルをコーディングしています。その主な目的は、ログインしているすべてのユーザーのデスクトップを構成することです。次の API を呼び出して、スクリーンセーバーをセットアップします。

if(!SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, nTimeoutSec, 0, 0))
{
    //Error
    GetLastError();
}

if(!SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, nActive, 0, 0))
{
    //Error
    GetLastError();
}

上記のコードはほとんどの場合に機能しますが、複数のユーザーが Windows コンソールにログオンしている場合を除いて、この奇妙なエラー ERROR_OPERATION_IN_PROGRESS が発生します。ドキュメントを調べたところ、次の説明があります。

マシンが省電力モードまたはシステム ロック状態に入った場合、ERROR_OPERATION_IN_PROGRESS 例外が発生します。

わかりましたが、このエラーをどのように処理すればよいでしょうか?

PS。これは、Windows 8 で最も頻繁に発生します。

4

2 に答える 2

0

わかりましたので、これは実際には Windows 8 以降では不可能のようですが、MSDN には明示的に記載されていません。

私の研究

SetThreadExecutionStateに関する別の MSDN 記事では、Windows 8 ではES_DISPLAY_REQUIREDフラグが画面を起動しないと述べています。

Windows 8: このフラグはディスプレイをオンにしておくことしかできず、現在オフになっているディスプレイをオンにすることはできません。

アクティブなスクリーンセーバー ( SPI_SETSCREENSAVEACTIVE )を削除するための API 呼び出しがあり、次のように述べています。

マシンが省電力モードまたはシステム ロック状態に入った場合、ERROR_OPERATION_IN_PROGRESS 例外が発生します。

結論

システムはロック状態ではなく、省電力モード ( GUID_MIN_POWER_SAVINGSを使用) でもないため、Windows 8 以降のマシンでは画面をスリープ解除できないようです。

于 2016-05-12T21:55:00.447 に答える
0

SPI_SETSCREENSAVEACTIVEエラーが発生し、何もしない可能性があります。ウィンドウにWM_SYSCOMMANDwithSC_SCREENSAVEメッセージを送信してみてください。GetDesktopWindow()

于 2012-08-13T07:02:08.663 に答える