-2

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

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

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

a & 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,-和-windows-server-2003

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

但是上面的链接在windows 10和windows 8(嵌入式版本)上仍然不起作用,哪位专家给我一些建议?提前致谢。

4

1 回答 1

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

于 2017-06-14T09:50:25.180 回答