如何防止Windows进入空闲状态?

时间:2011-06-10 05:05:58

标签: c# windows

我正在开发一个C#应用程序,它在后台运行,没有任何Windows控件。

我想通知Windows我的应用程序仍处于活动状态,以防止Windows进入空闲状态。

是否有任何API可以从我的应用程序调用,通知Windows操作系统我的应用程序仍然存在?

提前致谢。

5 个答案:

答案 0 :(得分:35)

您必须使用SetThreadExecutionState功能。像这样:

public partial class MyWinForm: Window
{
    private uint fPreviousExecutionState;

    public Window1()
    {
        InitializeComponent();

        // Set new state to prevent system sleep
        fPreviousExecutionState = NativeMethods.SetThreadExecutionState(
            NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED);
        if (fPreviousExecutionState == 0)
        {
            Console.WriteLine("SetThreadExecutionState failed. Do something here...");
            Close();
        }
    }

    protected override void OnClosed(System.EventArgs e)
    {
        base.OnClosed(e);

        // Restore previous state
        if (NativeMethods.SetThreadExecutionState(fPreviousExecutionState) == 0)
        {
            // No way to recover; already exiting
        }
    }
}

internal static class NativeMethods
{
    // Import SetThreadExecutionState Win32 API and necessary flags
    [DllImport("kernel32.dll")]
    public static extern uint SetThreadExecutionState(uint esFlags);
    public const uint ES_CONTINUOUS = 0x80000000;
    public const uint ES_SYSTEM_REQUIRED = 0x00000001;
}

答案 1 :(得分:18)

您有几个选择:

  • 使用SetThreadExecutionState,其中:

      

    允许应用程序通知系统它正在使用中,从而防止系统在应用程序运行时进入睡眠状态或关闭显示屏。

    您可以使用ES_SYSTEM_REQUIRED标志

      

    通过重置系统空闲计时器强制系统处于工作状态。

  • 使用SendInput伪造击键,鼠标移动/点击

  • 另一种方法是将您的应用更改为Windows服务。

SetThreadExecutionState示例

// Television recording is beginning. Enable away mode and prevent
// the sleep idle time-out.
SetThreadExecutionState(
    ES_CONTINUOUS | 
    ES_SYSTEM_REQUIRED | 
    ES_AWAYMODE_REQUIRED);

// Wait until recording is complete...
// Clear EXECUTION_STATE flags to disable away mode and allow the system
// to idle to sleep normally.
SetThreadExecutionState(ES_CONTINUOUS);

答案 2 :(得分:10)

您可以使用此处描述的SetThreadExecutionState

由于它是一个Win32 API函数,要从C#中使用它,你需要PInvoke它。这里描述了这些步骤,包括暂时禁用睡眠模式的示例方法PreventSleep

答案 3 :(得分:0)

我认为没有办法直接在托管代码中执行此操作。

快速搜索显示2年前的this帖子。基本上你需要做一些互操作来调用原始的Windows API。

答案 4 :(得分:0)

这是SetThreadExecutionState C#实现