阻止计算机进入休眠或是睡眠的方法

本文介绍了三种通过命令行进入休眠或睡眠模式的方法,包括使用rundll32.exe、PowerShell脚本以及PsShutdown工具。此外,还探讨了通过过滤Windows的WM_POWERBROADCAST消息来防止系统自动进入休眠的编程策略,特别是在Win7/Win8系统中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.通过cmd命令行来实现

参考:计算机睡眠功能命令,使用WINDOWS命令行进入睡眠模式_齐妹爱了爱了的博客-优快云博客

本文介绍3种进入睡眠/休眠模式的命令行写法。

Windows仅允许硬件电源按钮,或“开始菜单/开始屏幕”电源按钮进入睡眠(待机)模式,并没有提供直接进入睡眠模式的命令行工具。

方法1:

如果你的PC上禁用了休眠模式,则可以使用以下命令进入睡眠模式:

C:\Windows\System32\rundll32.exe powrprof.dll,SetSuspendState 0,1,0

但是,如果你启用了休眠模式(默认情况下就是这样),以上命令将使PC休眠,而不是进入睡眠。因此需要这样写:

powercfg -h off

C:\Windows\System32\rundll32.exe powrprof.dll,SetSuspendState 0,1,0

powercfg -h on

第一行禁用了休眠模式,第二行使得PC进入睡眠状态,第三行再允许休眠模式。

注:第1行和第3行都需要管理员权限。

方法2:

创建纯文本文件sleep.ps1:

Add-Type -Assembly System.Windows.Forms

[System.Windows.Forms.Application]::SetSuspendState("Suspend", $false, $true)

再运行Powershell调用之,即进入睡眠模式:

powershell -File C:\your-path\sleep.ps1

如果报错说无权运行脚本,先运行这个命令(需管理员权限):

powershell Set-ExecutionPolicy RemoteSigned

方法3:

下载SysInternals的PsShutdown工具,此工具可以在不禁用休眠,也不用提升至管理员权限的情况下使PC进入睡眠状态,这也是优选的方法:

psshutdown.exe -d -t 0 -accepteula

2.过滤窗口的消息函数

参考:如何禁止或暂停Windows的自动屏保、休眠等节电模式_dvlinker的博客-优快云博客_windows自动休眠

 Windows在执行电源相关设置的事务时,会发送 WM_POWERBROADCAST消息,我们可以截获到该消息, 相关代码如下所示。其中wParam参数指定了即将执行的系统命令类型。值PBT_APMQUERYSUSPEND表明此时执行的是待机,休眠的请求,过滤掉这个消息,就可以阻止系统进入待机或休眠等模式。截获到该通知消息,直接返回BROADCAST_QUERY_DENY即可,

    //为相关窗口类添加虚函数WindowProc    

LRESULT CXXXXWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{

           if (message == WM_POWERBROADCAST && wParam == PBT_APMQUERYSUSPEND)
           {
                 return BROADCAST_QUERY_DENY;
           }

           return CWnd::WindowProc(message, wParam, lParam);
}

        但是对于WM_POWERBROADCAST消息,在Win7/Win8中是不会在UAC控制下的程序中广播的,要收到该消息可以关闭UAC,或者manifest文件来提权。并且在Win7/Win8中,如果按上述方法收到WM_POWERBROADCAST消息,是截不到PBT_APMQUERYSUSPEND wParam值的,目前的办法是截获到WM_POWERBROADCAST消息就处理,不比对wParam参数值。

3.

​​​​​​参考:  Delphi WinAPI SetThreadExecutionState - 防止系统在应用程序运行时进入睡眠状态或关闭显示器。 - 滔Roy - 博客园

// 没生效;
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);

// 显示器会常亮,不进入休眠状态或是睡眠状态;
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);

MSDN说法:

The SetThreadExecutionState function cannot be used to prevent the user from putting the computer to sleep. Applications should respect that the user expects a certain behavior when they close the lid on their laptop or press the power button.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值