【问题标题】:Allow wake timers Windows 7/Vista允许唤醒定时器 Windows 7/Vista
【发布时间】:2012-01-20 00:41:04
【问题描述】:

我需要为所有电源计划设置启用 WakeTimers(计算机从睡眠/休眠状态唤醒)。

我试过 Win32_PowerSetting 但它只适用于英文版的 Windows。

我需要使用 .NET 2.0

感谢您的回复!

【问题讨论】:

    标签: c# windows-7 .net-2.0 windows-vista wakeup


    【解决方案1】:

    我怀疑您可以使用对 powrprof.dll 的 API 调用以及 WMI 来执行此操作,但我还没有时间弄清楚这种方法。

    此设置似乎只是一个布尔注册表项,根据您当前的电源计划定位:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes\(Current Power Scheme GUID)\(Sleep Category GUID)\(Enable AC or DC Wake Timers GUID) = 0 或 1

    与其直接操作注册表相比,更简洁的方法是使用 powercfg.exe 启用这些设置。

    对于交流电源:

    powercfg.exe -SETACVALUEINDEX SCHEME_CURRENT SUB_SLEEP bd3b718a-0680-4d9d-8ab2-e1d2b4ac806d 1

    对于电池:

    powercfg.exe -SETDCVALUEINDEX SCHEME_CURRENT SUB_SLEEP bd3b718a-0680-4d9d-8ab2-e1d2b4ac806d 1

    编辑:

    当使用高性能电源方案在交流电源上运行时,这会在我的系统上启用唤醒计时器(纯粹作为概念证明):

    [DllImport("powrprof.dll", EntryPoint = "PowerWriteACValueIndex", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern uint PowerWriteACValueIndex(IntPtr RootPowerKey, ref Guid SchemeGuid, ref Guid SubGroupOfPowerSettingsGuid, ref Guid PowerSettingGuid, uint AcValueIndex);
    
    public static void EnableWakeTimers()
    {
        Guid Root = new Guid("8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c"); // High Performance GUID
        Guid Sleep = new Guid("238c9fa8-0aad-41ed-83f4-97be242c8f20"); // Sleep Subcategory GUID
        Guid WakeTimers = new Guid("bd3b718a-0680-4d9d-8ab2-e1d2b4ac806d"); // Wake Timers GUID
    
        PowerWriteACValueIndex(IntPtr.Zero, ref Root, ref Sleep, ref WakeTimers, 1);
    }
    

    这个参考是你的朋友:http://msdn.microsoft.com/en-us/library/aa373163%28v=vs.85%29.aspx

    【讨论】:

    • 感谢您的回复。我会检查它:)
    【解决方案2】:

    我编写了这个 powershell 脚本来启用或禁用所有当前电源方案的唤醒计时器。在倒数第二行“POWERCFG -setacvalueindex $xAll $xSubGuid $zz 1” - 1 表示启用。只需将其更改为 0 即可禁用。

    CLS
    #Capture Current Active Power Scheme
    $orgScheme = POWERCFG -GETACTIVESCHEME  
    $yOrg = $orgScheme -split "\s+"
    $xOrg = $yOrg[3]
    Write-host Original Scheme = $xOrg
    Echo __________________________________
    Echo " "
    
    $allScheme = POWERCFG /L
    #Echo $allScheme
    
    foreach ($line in $allScheme)
      {
      if ($line.Length -gt 40)
            {
            if ($line.substring(0,5) -eq "Power")
                {
                $yAll = $line -split "\s+"
                $xAll = $yAll[3]
                write-host $xAll
                Powercfg -S $xAll
    
                $pScheme = POWERCFG /Q
                foreach ($line in $pScheme)
                    {
                    $yy = $line -split "\s+"
                    $xx = $yy[5]+$yy[6]+$yy[7]+$yy[8]
                    $zz = $yy[4]
                    $xSubGroup = $yy[1]
    
                    If($xSubGroup -eq "SubGroup")
                        {
                        $xSubGuid = $yy[3]
                        }
    
                    If($xx -eq "(allowwaketimers)")
                         {
                          write-host Power Scheme Guid = $xAll
                          write-host Subgroup Guid = $xSubGuid
                          write-host WakeUp Guid = $zz
                          Write-host POWERCFG -setacvalueindex $x $xSubGuid $zz 1
                          Echo " "
                          break
                         }
                    }
                POWERCFG -setacvalueindex $xAll $xSubGuid $zz 1
                }
            }
      }
    Powercfg -S $xOrg
    

    享受吧。

    【讨论】:

      【解决方案3】:

      看来您可以使用 WMI 来更改设置。

      http://www.daniweb.com/software-development/csharp/threads/272577

      Microsoft 有一个 WMI 代码创建器可以帮助您:

      https://www.microsoft.com/download/en/confirmation.aspx?displayLang=en&id=8572

      您将需要在“root\CIMV2\power”下搜索电源管理内容。

      【讨论】:

      • 但它只适用于英文版的Windows。我正在使用以下代码ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2\\power", "SELECT * FROM Win32_PowerSetting WHERE ElementName = 'Allow wake timers'"); fxp 捷克版本有: ElementName = 'Povolit časovače pro probuzení' 并且通过 InstanceID 选择不起作用...
      【解决方案4】:

      来自https://adameyob.com/2015/02/how-to-enable-wake-timers/#comment-17

      powercfg /SETACINDEXVALUE SCHEME_BALANCED SUB_SLEEP RTCWake 1
      powercfg /SETACINDEXVALUE SCHEME_MIN SUB_SLEEP RTCWake 1
      powercfg /SETACINDEXVALUE SCHEME_MAX SUB_SLEEP RTCWake 1
      

      或来自http://adameyob.com/2015/02/how-to-enable-wake-timers/#comment-31

      FOR /f “tokens=1,2,3,4” %%I IN (‘powercfg.exe /getactivescheme’) DO ( SET GUID=%%L )
      powercfg /setacvalueindex %GUID% SUB_SLEEP RTCWAKE 1
      

      【讨论】:

        猜你喜欢
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        • 2014-10-03
        • 1970-01-01
        • 2015-12-18
        相关资源
        最近更新 更多