27

对于特定的应用程序,我需要在运行时禁用屏幕保护程序。操作员可以手动将其关闭,然后再打开,但最简单的做法是在应用程序运行时保持屏幕保护程序处于关闭状态。

我该怎么做呢?我找到了使用 SPI_SETSCREENSAVEACTIVE 实际关闭屏幕保护程序的代码,但我认为这不是我想要的。

4

5 回答 5

40

编辑 - 我在SetThreadExecutionState这里使用现代电源可用性请求 API(取代)有一个更新的答案: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

theoldnewthing有你的答案:使用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

尝试使您的表单最高值正确,它对我有用,即使在空闲时间之后屏幕保护程序也不会出现...

于 2010-03-15T12:32:39.217 回答