1.通过cmd命令行来实现
参考:计算机睡眠功能命令,使用WINDOWS命令行进入睡眠模式_齐妹爱了爱了的博客-CSDN博客
Windows仅允许硬件电源按钮,或“开始菜单/开始屏幕”电源按钮进入睡眠(待机)模式,并没有提供直接进入睡眠模式的命令行工具。
方法1:
如果你的PC上禁用了休眠模式,则可以使用以下命令进入睡眠模式:
C:WindowsSystem32rundll32.exe powrprof.dll,SetSuspendState 0,1,0
但是,如果你启用了休眠模式(默认情况下就是这样),以上命令将使PC休眠,而不是进入睡眠。因此需要这样写:
powercfg -h off
C:WindowsSystem32rundll32.exe powrprof.dll,SetSuspendState 0,1,0
powercfg -h on
第一行禁用了休眠模式,第二行使得PC进入睡眠状态,第三行再允许休眠模式。
注:第1行和第3行都需要管理员权限。
方法2:
Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.Application]::SetSuspendState(“Suspend”, $false, $true)
再运行Powershell调用之,即进入睡眠模式:
powershell -File C:your-pathsleep.ps1
如果 错说无权运行脚本,先运行这个命令(需管理员权限):
powershell Set-ExecutionPolicy RemoteSigned
方法3:
下载SysInternals的PsShutdown工具,此工具可以在不禁用休眠,也不用提升至管理员权限的情况下使PC进入睡眠状态,这也是优选的方法:
psshutdown.exe -d -t 0 -accepteula
2.过滤窗口的消息函数
参考:如何禁止或暂停Windows的自动屏保、休眠等节电模式_dvlinker的博客-CSDN博客_windows自动休眠
Windows在执行电源相关设置的事务时,会发送 WM_POWERBROADCAST消息,我们可以截获到该消息, 相关代码如下所示。其中wParam参数指定了即将执行的系统命令类型。值PBT_APMQUERYSUSPEND表明此时执行的是待机,休眠的请求,过滤掉这个消息,就可以阻止系统进入待机或休眠等模式。截获到该通知消息,直接返回BROADCAST_QUERY_DENY即可,
//为相关窗口类添加虚函数WindowProc
但是对于WM_POWERBROADCAST消息,在Win7/Win8中是不会在UAC控制下的程序中广播的,要收到该消息可以关闭UAC,或者manifest文件来提权。并且在Win7/Win8中,如果按上述方法收到WM_POWERBROADCAST消息,是截不到PBT_APMQUERYSUSPEND wParam值的,目前的办法是截获到WM_POWERBROADCAST消息就处理,不比对wParam参数值。
3.
??????参考: Delphi WinAPI SetThreadExecutionState – 防止系统在应用程序运行时进入睡眠状态或关闭显示器。 – 滔Roy – 博客园
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.
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!