【问题标题】:c# , Timer disactivate prevent sleep functionc#, Timer disactivate 防止睡眠功能
【发布时间】:2015-10-01 19:00:36
【问题描述】:

我使用如下 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 分钟内激活和阻止。这将像一个循环。喜欢
我想防止 Windows 仅在 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 分钟后激活睡眠”?
提前谢谢!

【问题讨论】:

  • 没有合理的非破解方式,因为您违反了用户设置。您要么定义您的线程“如此重要”以使系统保持活动状态,要么您尊重用户设置。您要做的是覆盖系统配置中的用户设置。因此,您的问题的正确答案是:指示用户将睡眠时间设置为您想要的值(40 分钟),如果他们不想这样做,请尊重这一点。
  • 好问题,但请谨慎使用您的术语。你所指的“函数”实际上是“子程序”。

标签: c# timer


【解决方案1】:

使用ES_CONTINUOUS,您无需定期调用它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2021-04-12
    • 2011-03-23
    • 1970-01-01
    相关资源
    最近更新 更多