windows8下如何中断屏保

How to interrupt Screen-saver under windows 8

我想知道在Windows8(内嵌版)或Windows10下如何中断屏保,因为我的项目只有一个window(C#)运行在正常状态下,否则在屏保下运行会报错。所以我想在此 window 弹出窗口之前中断屏幕保护程序。

我研究了一些解决方案和想法,包括如下,

a 和 b 都是我尝试过的方法,并且在 windows 10 上工作得很好,但在 Windows 8(嵌入式版本)上没有工作,所以目前我只关注c方式,关于c方式我搜索如下link,

https://support.microsoft.com/en-us/help/140723/how-to-force-a-screen-saver-to-close-once-started-in-windows-nt,-windows-2000,-and-windows-server-2003

https://www.codeproject.com/Articles/17067/Controlling-The-Screen-Saver-With-C

但是link以上的在windows10和Windows8(内嵌版)上还是不行,哪位高手给点建议?提前致谢。

查看非托管 API 函数 GetSystemPowerStatusSetThreadExecutionState。使用(线程)计时器,您可以定期更新状态,例如来自 class 属性,并告知系统您的要求。这很有用,如果您的应用程序可能允许或禁止屏幕保护程序,具体取决于它的操作状态。

public class PowerManager : IDisposable
{
  [Flags]
  public enum ExecutionStateEnum : uint
  {
    LetTheSystemDecide    = 0x00,
    SystemRequired        = 0x01,
    SystemDisplayRequired = 0x02,
    UserPresent           = 0x04,
    Continuous            = 0x80000000,
  }

  [DllImport("kernel32")]
  private static extern uint SetThreadExecutionState(ExecutionStateEnum esFlags);

  public PowerManager() {}

  public Update(ExecutionStateEnum state)
  {
    SetThreadExecutionState(state);
  }
}

更新:

然后调用 PowerManager.Update(ExecutionStateEnum.SystemDisplayRequired) 禁用屏幕保护程序或调用 PowerManager.Update(ExecutionStateEnum.LetTheSystemDecide) 恢复默认系统行为(允许屏幕保护程序)。 如果从计时器回调中定期调用该方法,请根据配置的屏幕保护程序超时调整计时器间隔。