27

特定のアプリケーションについて、実行中はスクリーン セーバーを無効にする必要があります。オペレーターは手動でオフにして、後で再びオンにすることもできますが、最も簡単なのは、アプリケーションの実行中にスクリーン セーバーを寄せ付けないことです。

どうすればいいですか?SPI_SETSCREENSAVEACTIVE で実際にスクリーン セーバーをオフにするコードを見つけましたが、それは私が望んでいるものではないと思います。

4

5 に答える 5

40

編集 - ここで最新の Power Availability Request API (supersedes SetThreadExecutionState) を使用して更新された回答があります: https://stackoverflow.com/a/63632916/67824

[FlagsAttribute]
public enum EXECUTION_STATE : uint
{
    ES_SYSTEM_REQUIRED = 0x00000001,
    ES_DISPLAY_REQUIRED = 0x00000002,
    // Legacy flag, should not be used.
    // ES_USER_PRESENT   = 0x00000004,
    ES_AWAYMODE_REQUIRED = 0x00000040,
    ES_CONTINUOUS = 0x80000000,
}

public static class SleepUtil
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
}

public void PreventSleep()
{
    if (SleepUtil.SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS
        | EXECUTION_STATE.ES_DISPLAY_REQUIRED  
        | EXECUTION_STATE.ES_SYSTEM_REQUIRED 
        | EXECUTION_STATE.ES_AWAYMODE_REQUIRED) == 0) //Away mode for Windows >= Vista
        SleepUtil.SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS
            | EXECUTION_STATE.ES_DISPLAY_REQUIRED 
            | EXECUTION_STATE.ES_SYSTEM_REQUIRED); //Windows < Vista, forget away mode
}

クレジット: P/Invokeデッドポイント

于 2010-09-17T23:16:11.697 に答える
16

古い新しいものにはあなたの答えがあります: を使用してくださいSetThreadExecutionState(ES_DISPLAY_REQUIRED)

これは、ビデオ プレーヤーと PowerPoint で使用されます。

于 2009-08-23T13:59:39.477 に答える
3
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS
            | EXECUTION_STATE.ES_DISPLAY_REQUIRED 
            | EXECUTION_STATE.ES_SYSTEM_REQUIRED);

これは XP では役に立ちません。

実際、この関数は異なる Windows バージョン間で操作できません (ただし、Windows Vista 以降ではかなりうまく機能します)... Windows XP / 2003 では、この関数は ES_USER_PRESENT | で呼び出されます。ES_CONTINUOUS (両方を呼び出す必要があります)...これにより、システムとディスプレイの両方のアイドル タイマーが定期的にリセットされます...他の Windows バージョンでは、ES_SYSTEM_REQUIRED | を使用することをお勧めします。ES_DISPLAY_REQUIRED | ES_CONTINUOUS | ES_AWAYMODE_REQUIRED...

于 2012-01-23T14:37:09.993 に答える
2

SPI_SETSCREENSAVEACTIVE を指定した SystemParametersInfo は、これを行う通常の方法です。ただし、画面ロックは無効になりません。

于 2008-10-27T20:12:01.487 に答える
0

フォームの最上位の値をtrueにしてみてください。それは私にとってはうまくいきます。アイドル時間の後でも、スクリーンセーバーは実現しませんでした...

于 2010-03-15T12:32:39.217 に答える