Windows C#/。Netでスクリーンセーバー/画面ロックを無効にする必要がある[終了]

StackOverflow https://stackoverflow.com/questions/241222

  •  04-07-2019
  •  | 
  •  

質問

特定のアプリケーションでは、実行中のスクリーンセーバーを無効にする必要があります。オペレーターは手動で電源を切ってから再び電源を入れることができますが、最も簡単な方法は、アプリケーションの実行中にスクリーンセーバーを停止することです。

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

役に立ちましたか?

解決

theoldnewthing にはあなたの答えがあります: SetThreadExecutionState(ES_DISPLAY_REQUIRED)

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

他のヒント

[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 デッドポイント

SPI_SETSCREENSAVEACTIVEを使用した

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

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 ...

フォームを最上位の値に設定してみてください true 動作しますスクリーンセーバーは、アイドル時間の後でも来ません...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top