以编程方式停止屏幕保护程序

Posted

技术标签:

【中文标题】以编程方式停止屏幕保护程序【英文标题】:Stop Screensaver programmatically 【发布时间】:2016-11-11 23:22:15 【问题描述】:

如何在屏幕保护程序运行时停止它?无需移动鼠标或按键盘上的键。我的应用程序输入来自读卡器,如果屏幕保护程序正在运行,我的应用程序仍然可以正常工作,但当读卡器收到输入时屏幕保护程序不会停止。

我试过这个 http://www.codeproject.com/Articles/17067/Controlling-The-Screen-Saver-With-C ,似乎不适合我。

我尝试在此线程 How do I turn off the windows screen saver if it is running using C#? 上伪造鼠标移动,如线程中所述,它似乎不适用于 Windows 8(我在 Windows 8.1 上运行)。

我什至尝试过SendKeys

我看到的大多数其他问题/示例都是为了阻止我不想要的屏幕保护程序启动。如果我的读卡器有输入,我希望屏幕保护程序启动和停止。

【问题讨论】:

屏保你写了吗? @ManoDestra 你是什么意思?它只是windows个性化菜单下的普通屏保。 我假设你的意思是不。在这种情况下,您可能很难做到这一点。如果你自己写屏保的话,会简单很多。 在您的智能卡读卡器输入中,您可以像这样更改注册表值 -Call Registry.SetValue("HKEY_CURRENT_USER\Control Panel\Desktop", "ScreenSaveActive", "1") 这适用于 Windows 7. 不确定 Windows 8。 @Sanket 这是做什么的?我检查了这个值,它目前已经是 1。 【参考方案1】:

使用SetThreadExecutionState 这个winAPI 告诉操作系统线程正在使用中,即使用户没有与计算机交互。这些将防止出现屏幕保护程序并阻止机器自动挂起。

使应用程序能够通知系统它正在使用,从而防止系统在应用程序运行时进入睡眠或关闭显示器。

有一系列标志来指定当前线程的新状态:

ES_AWAYMODE_REQUIRED (0x00000040):启用离开模式。 ES_DISPLAY_REQUIRED (0x00000002) :通过重置显示空闲计时器来强制打开显示。 ES_SYSTEM_REQUIRED (0x00000001) :通过重置系统空闲计时器强制系统处于工作状态。 ES_CONTINUOUS (0x80000000) :通知系统正在设置的状态应保持有效,直到下一次使用 ES_CONTINUOUS 的调用和其他状态标志之一被清除。

因为这是一个winAPI,所以你必须PInvoke这个:

[DllImport("kernel32.dll", CharSet = CharSet.Auto,SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);

用户定义类型:

[FlagsAttribute]
public enum EXECUTION_STATE :uint

   ES_AWAYMODE_REQUIRED = 0x00000040,
   ES_CONTINUOUS = 0x80000000,
   ES_DISPLAY_REQUIRED = 0x00000002,
   ES_SYSTEM_REQUIRED = 0x00000001
 

Here下面是调用过程:

//To stop screen saver and monitor power off event
//You can combine several flags and specify multiple behaviors with a single call
SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);

//To reset or allow those event again you have to call this API with only ES_CONTINUOUS
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);//This will reset as normal

根据MSDN,此 API 可以安全使用。

系统维护调用 SetThreadExecutionState 的应用程序的计数。系统跟踪调用 SetThreadExecutionState 的每个线程并相应地调整计数器。如果此计数器达到零并且没有任何用户输入,则系统进入睡眠状态。

如果应用程序在重置标志之前崩溃,系统将调整并自动重置。

【讨论】:

非常明确的答案值得更多的支持。我知道最初的问题是关于防止 screen-saver,但我会证明 SetThreadExecutionState 在没有鼠标或没有鼠标时防止 lock-screen 绝对有效键盘活动。

以上是关于以编程方式停止屏幕保护程序的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式更改屏幕保护程序?

在 Mac OSX 中以编程方式阻止屏幕保护程序

以编程方式关闭 Amazon Fire TV 屏幕保护程序

当我的应用程序在 iOS 应用程序的前台时,是不是有停止屏幕锁定?

以编程方式停止向iPhone发送消息

iOS - 以编程方式截取跳板(主屏幕)的屏幕截图