c#,定时器禁用防止睡眠功能

时间:2015-10-01 19:00:37

标签: c# timer

我使用以下c#代码来防止睡眠和监控关闭:

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;
    public const uint ES_DISPLAY_REQUIRED = 0x00000002;
}


并在Formload上调用此函数:

private void PreventSleep()
{
    NativeMethods.SetThreadExecutionState(NativeMethods.ES_CONTINUOUS |  NativeMethods.ES_SYSTEM_REQUIRED);
}

private void PreventMonitorOff()
{
    NativeMethods.SetThreadExecutionState(NativeMethods.ES_CONTINUOUS | NativeMethods.ES_DISPLAY_REQUIRED);
}


这种代码方式让我永无止境。我想要的是时间限制。

如果没有使用电脑的用户,请说40分钟后睡觉。我想在40分钟后停用这些功能。然后当用户完成使用计算机我想激活并在40分钟内阻止。它就像一个循环。像
我想阻止窗户在40分钟内进入睡眠状态,然后如果没有使用电脑的用户那样照常睡觉。然后,当计算机没有用户时,我想在40分钟后等待它再次入睡。

我尝试使用间隔为2400000(40分钟)的计时器:

private void timer1_Tick(object sender, EventArgs e)
{
    PreventSleep();
    PreventMonitorOff();
}

并调用这些功能:

private void Form1_Load(object sender, EventArgs e)
{
    timer1.Start();
}


如何使用这些函数进行循环,并且此代码将知道"现在有鼠标或键盘移动并在40分钟后激活睡眠"?
提前谢谢!

1 个答案:

答案 0 :(得分:0)

使用ES_CONTINUOUS,您无需定期拨打电话。

因此,将计时器设置为40分钟,然后删除ES_CONTINOUS标志(请参阅MSDN)。难点在于检测用户是否实际上处于空闲状态。如果你没有特定的行动来确定这一点,那么最好让操作系统做出决定。您可以使用powercfg API来强制超时。