计划任务运行后如何保持 PC 保持唤醒状态?

计划任务运行后如何保持 PC 保持唤醒状态?

我有一台电脑,我可以在一周中特定日子的特定时间通过远程桌面访问它。从物理上来说,它不方便访问,所以我希望它能自动唤醒并在这些时间保持唤醒状态,但可以在其他时间休眠。我既不需要也不希望它“通过局域网唤醒”(主要是因为A)我不希望每次打开 Windows 资源管理器窗口时都唤醒它,而且b)我发现“局域网唤醒”功能很挑剔而且不可靠)。

为了实现这个目标,我使用了powercfg任务计划程序中的命令,如下所示这个问题的答案。 这几乎可以正常工作;这些任务确实可以按预期正确更改电源方案。但是,在唤醒并选择“高性能”方案后,计算机两分钟后又回到睡眠状态,尽管该方案明确禁用了睡眠。

我需要更改哪些 Windows 设置才能使计算机在任务运行后保持唤醒状态并将“高性能”方案设置为活动电源计划?

答案1

Windows 实际上还有第二个隐藏设置,用于控制睡眠行为。每当计算机因用户明确要求以外的其他原因而唤醒时,都会使用该设置,例如当计划任务已配置为在运行时唤醒计算机时。此设置的默认值为2 Minutes

此设置可以在“电源选项”对话框中更改,但必须在取消隐藏后才能更改。您可以使用以下命令完成此操作:

powercfg -attributes SUB_SLEEP 7bc4a2f9-d8fc-4469-b07b-33eb785aaca0 -ATTRIB_HIDE

powercfg告诉消除ATTRIB_HIDE来自的属性“睡眠无人值守睡眠超时”在设置的“睡眠”子部分下找到设置。该设置的 GUID 是7bc4a2f9-d8fc-4469-b07b-33eb785aaca0。在命令提示符窗口中运行该命令后,下次打开“电源选项”对话框时,您将看到此设置可用:

电源选项对话框

只需将值更改为您喜欢的任何值,即,只要您希望计算机在唤醒后保持唤醒状态以运行计划任务,该值就足够长,以使计算机保持唤醒状态。将值设置为可0 Minutes完全禁用超时;这将允许计算机遵循电源计划的常规“睡眠后”设置。

如果您想要再次隐藏该选项,只需将值恢复ATTRIB_HIDE为设置:

powercfg -attributes SUB_SLEEP 7bc4a2f9-d8fc-4469-b07b-33eb785aaca0 +ATTRIB_HIDE

答案2

只有一个正确的方法这样做。切勿更改设置。

运行一个程序以防止程序运行时进入睡眠状态或关闭显示器。不会影响屏幕保护程序。

更多信息请参阅文档https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setthreadexecutionstate

注意:不要使用常量

ES_USER_PRESENT因为它总会失败。

来自上面的链接

使用

KeepDisplayOn <commandline of program to run>

KeepSystemOn <commandline of program to run>

@Echo Off

ECHO Three files follow

ECHO PreventSleep.bat

ECHO.

ECHO This file compiles KeepDisplayOn.vb and KeepSystemOn.vb to KeepDisplayOn.exe and KeepSystemOn.exe using the system VB.NET compiler.

ECHO.

ECHO Runs a program preventing sleeping or the display turning off while the program runs

ECHO.

ECHO To Use

ECHO      KeepDisplayOn ^<commandline of program to run^>

ECHO      KeepSystemOn ^<commandline of program to run^>

ECHO.

C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc "%~dp0\KeepDisplayOn.vb" /out:"%~dp0\KeepDisplayOn.exe" /target:winexe

C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc "%~dp0\KeepSystemOn.vb" /out:"%~dp0\KeepSystemOn.exe" /target:winexe

pause

'KeepSystemOn.vb

imports System.Runtime.InteropServices 



Public Module MyApplication  



Public Declare UNICODE Function SetThreadExecutionState Lib "Kernel32" (ByVal esFlags as Integer) as Integer

Public Const  ES_AWAYMODE_REQUIRED = &h40

Public Const  ES_CONTINUOUS = &h80000000

Public Const  ES_DISPLAY_REQUIRED = &h2

Public Const  ES_SYSTEM_REQUIRED = &h1

Public Const  ES_USER_PRESENT = &h4





    Public Sub Main ()

        Dim wshshell as Object

        Dim Ret as Integer

        WshShell = CreateObject("WScript.Shell")

        Ret = SetThreadExecutionState(ES_Continuous + ES_System_Required + ES_Awaymode_Required)

        WshShell.Run(Command(), , True)

    End Sub 

End Module 

'KeepDisplayOn.vb

imports System.Runtime.InteropServices 



Public Module MyApplication  



Public Declare UNICODE Function SetThreadExecutionState Lib "Kernel32" (ByVal esFlags as Integer) as Integer

Public Const  ES_AWAYMODE_REQUIRED = &h40

Public Const  ES_CONTINUOUS = &h80000000

Public Const  ES_DISPLAY_REQUIRED = &h2

Public Const  ES_SYSTEM_REQUIRED = &h1

Public Const  ES_USER_PRESENT = &h4





    Public Sub Main ()

        Dim wshshell as Object

        Dim Ret as Integer

        WshShell = CreateObject("WScript.Shell")

        Ret = SetThreadExecutionState(ES_Continuous + ES_Display_Required + ES_Awaymode_Required)

        WshShell.Run(Command(), , True)

    End Sub 

End Module 

也发布到我的存储库https://winsourcecode.blogspot.com/2020/05/keepdisplayon-runs-program-preventing.html

相关内容