如何在Windows 8下中断屏幕保护程序

时间:2017-06-14 08:01:09

标签: c# windows-screensaver

我想知道如何在Windows 8(嵌入式版本)或Windows 10下中断屏幕保护程序,因为我项目的窗口(C#)只能在正常状态下运行,否则如果在屏幕下运行则会出错-saver。所以我想在弹出这个窗口之前中断屏幕保护程序。

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

  • 一个。移动鼠标(使用user32的mouse_event api)
  • 湾发送密钥(也使用user32的api)
  • ℃。杀死屏幕保护程序。

两者都是& b是我尝试过它们并在Windows 10上运行良好的方法,但是没有在Windows 8(嵌入式版本)上运行,所以目前我只专注于c方式,关于c的方式我搜索了如下链接,

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

但上面的链接仍然无法在Windows 10和Windows 8(嵌入式版本)上运行,哪位高手给我一些建议?提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

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)以恢复默认系统行为(允许屏幕保护程序)。 如果从定时器回调中定期调用该方法,请根据配置的屏幕保护程序超时调整定时器间隔。