Windows C#/。Netでスクリーンセーバー/画面ロックを無効にする必要がある[終了]
-
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 、デッドポイント
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 動作しますスクリーンセーバーは、アイドル時間の後でも来ません...