使用C#从高级电源设置获取Sleep After / Hibernate之后的值

时间:2018-04-09 07:52:18

标签: c# .net winforms

我正在尝试获取睡眠/休眠超时。

我在互联网上搜索。

已经搜索并找到了注册表和cmd命令解决方案, 但都失败了

cmd命令返回很多值但不是我需要的值。

我看到的注册表有一个字节数组,但不是我需要的那个。

我试过这个:Topic但即便这样也没有帮助我

在我公司,我们使用的软件可以在整个公司内设置Sleep / hibernated 在我的代码中,我希望得到那些时间(不是硬编码)

1 个答案:

答案 0 :(得分:1)

您可以使用 Windows API 注册表获取电源高级设置值,包括 Hibernate After Sleep After powercfg WMI

所有解决方案最重要的常见信息是一些GUID值:

  • 有效计划的GUID (您应该先找到它。)
  • 睡眠 子组的GUID:238c9fa8-0aad-41ed-83f4-97be242c8f20
  • Hibernate之后的 设置:9d7815a6-7ee4-497e-8888-515a05f02364
  • 之后的睡眠设置:29f6c1db-86da-48c5-9fdb-f2b67b1f44da
  • 的GUID

找到值后,通常值为 十六进制 ,并显示

使用Windows API

您可以使用PowerGetActiveScheme功能获取有效电源计划,然后您可以使用PowerReadACValue获取所需的值。

为此,请先声明:

private static Guid GUID_SLEEP_SUBGROUP =
    new Guid("238c9fa8-0aad-41ed-83f4-97be242c8f20");
private static Guid GUID_HIBERNATEIDLE =
    new Guid("9d7815a6-7ee4-497e-8888-515a05f02364");

[DllImport("powrprof.dll")]
static extern uint PowerGetActiveScheme(
    IntPtr UserRootPowerKey,
    ref IntPtr ActivePolicyGuid);

[DllImport("powrprof.dll")]
static extern uint PowerReadACValue(
    IntPtr RootPowerKey,
    ref Guid SchemeGuid,
    ref Guid SubGroupOfPowerSettingGuid,
    ref Guid PowerSettingGuid,
    ref int Type,
    ref int Buffer,
    ref uint BufferSize);

然后以这种方式找到值:

var activePolicyGuidPTR = IntPtr.Zero;
PowerGetActiveScheme(IntPtr.Zero, ref activePolicyGuidPTR);

var activePolicyGuid = Marshal.PtrToStructure<Guid>(activePolicyGuidPTR);
var type = 0;
var value = 0;
var valueSize = 4u;
PowerReadACValue(IntPtr.Zero, ref activePolicyGuid,
    ref GUID_SLEEP_SUBGROUP, ref GUID_HIBERNATEIDLE,
    ref type, ref value, ref valueSize);

MessageBox.Show($"Hibernate after {value} seconds.");

注意

您还可以在a blog post中找到使用Registry或使用WMI的示例。