使用SetThreadExecutionState函数来告诉系统程序正在运行,需要保持系统活跃。
Table of Contents
场景
在播放音乐时,我们会发现设置了系统电源管理-自动睡眠,计划不会生效,这个音频播放操作阻止了系统自动睡眠。但不会阻止息屏,所以Windows下一般屏幕关闭是不影响音频播放的。
一段时间不操作键盘和鼠标,屏幕便会关闭,系统会进入睡眠状态。但有些程序(比如游戏、视频和演示文稿)在运行过程中应该阻止屏幕关闭,否则屏幕总是关闭,会导致体验会非常糟糕。
在下载的时候阻止系统休眠。即不会因为休眠而终止下载任务,下载完成后自动转为休眠状态省电。
实现功能
防止屏幕自动关闭
防止系统进入睡眠模式
防止自动锁屏
防止熄屏
way 1.调用Windows API的SetThreadExecutionState函数
工作原理
调用Windows API的SetThreadExecutionState函数,告诉系统应用程序正在运行,需要保持显示和系统活跃。
这个程序可以是一个控制台应用程序,它设置执行状态,然后等待用户输入退出。
当程序运行时,系统不会自动锁屏或进入睡眠状态。当用户按下任意键时,程序退出,并恢复原来的电源设置。
注意:这个程序只影响睡眠和锁屏的超时,不会影响屏幕保护程序,但通常屏幕保护程序也会在系统不活动时启动,而设置执行状态可以同时阻止屏幕保护程序。
我们使用以下标志:
ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED
这样设置后,系统会认为用户正在与程序交互,从而不会自动锁屏或进入睡眠。
这个程序需要一直运行才能有效。如果关闭程序,系统将恢复原来的行为。
sample
using System;
using System.Runtime.InteropServices;
namespace SystemSleepPreventer
{
class Program
{
// 定义API函数
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern uint SetThreadExecutionState(ExecutionFlag flags);
[Flags]
enum ExecutionFlag : uint
{
System = 0x00000001, // 阻止系统休眠
Display = 0x00000002, // 阻止显示器关闭
Continuous = 0x80000000, // 持续生效直到显式取消
// 组合标志
SystemAndDisplay = System | Display,
ContinuousSystem = System | Continuous,
ContinuousDisplay = Display | Continuous,
ContinuousSystemAndDisplay = System | Display | Continuous
}
static void Main(string[] args)
{
Console.WriteLine("阻止系统休眠和屏幕关闭...");
// 设置持续阻止系统休眠和屏幕关闭
SetThreadExecutionState(ExecutionFlag.ContinuousSystemAndDisplay);
Console.WriteLine("按任意键恢复系统正常休眠行为...");
Console.ReadKey();
// 恢复系统默认电源管理行为
SetThreadExecutionState(ExecutionFlag.Continuous);
Console.WriteLine("已恢复系统正常休眠行为");
}
}
}
How to use
# 阻止系统休眠
// 临时阻止系统休眠(不阻止屏幕关闭)
SetThreadExecutionState(ExecutionFlag.System);
// 持续阻止系统休眠
SetThreadExecutionState(ExecutionFlag.ContinuousSystem);
# 阻止屏幕关闭
// 临时阻止屏幕关闭(不阻止系统休眠)
SetThreadExecutionState(ExecutionFlag.Display);
// 持续阻止屏幕关闭
SetThreadExecutionState(ExecutionFlag.ContinuousDisplay);
# 同时阻止休眠和屏幕关闭
// 临时阻止休眠和屏幕关闭
SetThreadExecutionState(ExecutionFlag.SystemAndDisplay);
// 持续阻止休眠和屏幕关闭
SetThreadExecutionState(ExecutionFlag.ContinuousSystemAndDisplay);
恢复系统默认行为
// 清除所有执行状态标志
SetThreadExecutionState(ExecutionFlag.Continuous);
使用场景
# 媒体播放应用
// 开始播放时
SetThreadExecutionState(ExecutionFlag.ContinuousSystem);
// 播放结束时
SetThreadExecutionState(ExecutionFlag.Continuous);
# 长时间运行任务
// 任务开始时
SetThreadExecutionState(ExecutionFlag.ContinuousSystemAndDisplay);
// 任务结束时
SetThreadExecutionState(ExecutionFlag.Continuous);
# PPT演示模式
// 演示开始时阻止屏幕关闭
SetThreadExecutionState(ExecutionFlag.ContinuousDisplay);
# 长时间运行任务sample
try
{
// 启用阻止
SetThreadExecutionState(ExecutionFlag.ContinuousSystem);
// 执行长时间操作...
}
finally
{
// 确保总是恢复系统设置
SetThreadExecutionState(ExecutionFlag.Continuous);
}
此函数不会停止屏幕保护程序执行?https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-setthreadexecutionstate
way 2.在Windows 10中,使用SetSuspendState来避免锁屏
win锁屏状态下,实现自动登录并解锁
需求:
实现 锁屏状态下运行一个程序实现自动登录。
想开机就自动进入系统,可以设置开机自动进入系统,重启是可以直接进入系统的;
锁定或者注销时不会自动进入系统的,实现 锁屏状态下运行一个程序实现自动登录。
方案
做一个 服务端和客户端 。之间用WinSocket 通讯, 每台客户机都装一个客户端。 服务端可以控制 客户机的锁屏和自动登录解屏。
思路
启动自动登录:
Windows 内置的 netplwiz 工具。 netplwiz 配置 Windows 10 自动登录, https://www.yisu.com/jc/486699.html
锁屏自动登录:
实现一个windows服务程序,开机启动这个服务。这样即时注销也能运行。登录功能用logonuser函数
1.windows service
c#
https://www.cnblogs.com/knowledgesea/p/3616127.html
2.LogonUserA
windows 是通过winlogon.exe 和Gina调用完成winlogon的登录。
C++
c#
https://pinvoke.net/default.aspx/secur32/LsaLogonUser.html
3. LogonUser sample
c++
https://learn.microsoft.com/en-us/previous-versions/aa379608(v=vs.85)?redirectedfrom=MSDN
https://ask.csdn.net/questions/7717458
Windows 10 休眠、睡眠、锁屏、注销、登录的区别详解
Useful links
1.Windows API的SetThreadExecutionState函数
https://www.cnblogs.com/mq0036/p/18661100
https://www.bilibili.com/opus/698944994851946546
https://www.cnblogs.com/ryanzheng/p/8066241.html