如何在程序执行期间防止屏幕保护程序和睡眠?
Posted
技术标签:
【中文标题】如何在程序执行期间防止屏幕保护程序和睡眠?【英文标题】:how do i prevent screen-savers and sleeps during my program execution? 【发布时间】:2011-04-09 14:00:01 【问题描述】:在 Win7 上运行的 c++ 程序中,有没有办法伪造鼠标移动或类似的东西,只是为了阻止屏幕保护程序启动和系统进入睡眠状态?我正在寻找最小的方法,我不喜欢使用 .NET。 谢谢, -nuun
【问题讨论】:
为什么不更改屏幕保护设置或系统电源设置? 作为您的程序的用户,我想自己决定是否希望某个程序的执行被某些屏幕保护程序减慢。如果您是自己的用户,您可以随时自行更改系统设置。 实际上这是一个有效的问题。我认为 Windows Media Player 在播放视频时会这样做,然后这是合理的(你不想每五分钟站起来移动鼠标只是为了欣赏你的电影,不是吗?也禁用屏幕保护程序只是为了看一个电影是矫枉过正)。 在 Powerpoint 中也是如此。您不希望您的笔记本电脑在演示过程中因为您花时间回答观众的问题而睡着了。我敢打赌,这就是添加 SetThreadExecutionState() 函数的充分理由。 【参考方案1】:不要乱用屏保设置,使用SetThreadExecutionState。这是用于通知窗口您的应用程序处于活动状态的 API:
使应用程序能够通知 它正在使用的系统,从而 阻止系统进入 睡眠或关闭显示器,同时 应用程序正在运行。
,和
多媒体应用,例如视频 播放器和演示应用程序, 必须使用 ES_DISPLAY_REQUIRED 当他们 长时间显示视频 无需用户输入
【讨论】:
SetThreadExecutionState() 非常适合控制系统和显示器睡眠,但它不会阻止屏幕保护程序启动。至少功能文档说不会。 更正:尽管此功能的 MSDN 页面声明“此功能不会阻止屏幕保护程序执行”。使用 ES_DISPLAY_REQUIRED 调用实际上会阻止屏幕保护程序触发。 如果您使用 .NET,这也是可行的方法(通过 p/invoke)-pinvoke.net/default.aspx/kernel32.SetThreadExecutionState【参考方案2】:这不是一个坏主意,任何像样的媒体播放器都可以...在 Win32 api 中查找 SystemParametersInfo(SPI_SETSCREENSAVEACTIVE ...)
函数,它应该可以解决问题。
【讨论】:
这不是媒体播放器所做的。看我的回答。【参考方案3】:这通常是一个特别糟糕的想法。桌面属于您的应用程序的用户,而不是您的应用程序。
如果我运行的应用程序在未经我许可的情况下禁用了我的屏幕保护程序(或移动我的桌面图标或将其自身添加到我的各种快速访问工具栏),它会很快被扔掉。
而且,如果您是用户,不要在您的应用程序中这样做。像我们其他人一样手动更改它:-)
如果您必须这样做(我敦促您不要这样做,但您可以随意忽略它),我认为自 NT 以来该方法没有改变。你使用SystemParametersInfo
和SPI_SETSCREENSAVEACTIVE
来改变行为。这些在内存中的user32.dll
中。
但我模糊记得看到在 Win7 下使用该方法报告的问题,我认为解决方案是更改注册表,将 HKEY_CURRENT_USER\Control Panel\Desktop
下的 ScreenSaveActive
设置为 0
(当您返回 1
'完成)。
【讨论】:
说在不需要用户输入的游戏中进行长时间的自动播放,您不希望屏幕保护程序打扰您的用户 坏主意?媒体播放器呢?【参考方案4】:在 Windows 启动屏幕保护程序之前,它会在 WM_SYSCOMMAND 消息中向应用程序发送 SC_SCREENSAVE 通知。如果应用程序想要阻止屏幕保护程序启动,则应将“已处理”标志设置为 true 并在消息处理期间返回零。还有 SC_MONITORPOWER 可以防止显示器进入低功耗状态。
https://docs.microsoft.com/en-us/windows/desktop/menurc/wm-syscommand
【讨论】:
【参考方案5】:当您为一家公司工作并需要运行测试时,当 PC 处于睡眠状态时,它会干扰测试。该公司制定了一项桌面政策,禁止您像在家一样进行更改。
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案6】:我不太清楚你为什么必须求助于这个。只需在电源设置中禁用这些选项即可。
您这样做的目的是什么。您的应用程序是一项服务吗? 如果是这样,您就不必为此烦恼了。
如果您的应用程序是 UI 应用程序,我也想不出一个有效的用例。
无论如何我们都需要更多信息。
【讨论】:
说在不需要用户输入的游戏中进行长时间的自动播放,您不希望屏幕保护程序打扰您的用户以上是关于如何在程序执行期间防止屏幕保护程序和睡眠?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Flutter 应用程序在锁定/睡眠屏幕上运行(地理定位器和计时器生成器)?
当在我们的应用程序外按住“睡眠/唤醒”和“主页”按钮进行屏幕截图时,如何将我们的应用程序的本地通知作为“使用我们的应用程序打开图像”