受欢迎的博客标签

C#程序防止电脑自动锁屏

Published

使用SetThreadExecutionState函数来告诉系统程序正在运行,需要保持系统活跃。

 

场景

在播放音乐时,我们会发现设置了系统电源管理-自动睡眠,计划不会生效,这个音频播放操作阻止了系统自动睡眠。但不会阻止息屏,所以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++

https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-logonusera?redirectedfrom=MSDN

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 休眠、睡眠、锁屏、注销、登录的区别详解

状态
电源消耗
恢复速度
数据保存位置
程序状态
​锁屏​
正常
即时
内存
全部保持
​登录​
正常
依赖认证速度
-
启动新会话
​注销​
正常
依赖登录速度
-
关闭用户程序
​睡眠​
极低(1-5W)
快(2-5秒)
内存
全部保持
​休眠​
零功耗
较慢(10-30秒)
硬盘
全部保持

 

 

 

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