【问题标题】:Get value of Sleep After/Hibernate After from advanced power settings从高级电源设置中获取 Sleep After/Hibernate After 的值
【发布时间】:2020-08-11 15:19:39
【问题描述】:

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

我在互联网上搜索过。

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

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

如我所见,注册表有一个字节数组,但不是我需要的。

我试过这个:Topic,但即使这样也没有帮助。

在我的公司,我们使用在整个公司设置睡眠/休眠的软件 在我的代码中,我想得到那个时间(而不是硬编码)。

【问题讨论】:

  • 如果您参考或解释了“注册表”和“cmd”解决方案以及它们为何不起作用,这可能会有所帮助。如果您发布您目前拥有的内容,并说明为什么这对您不起作用,这也可能会有所帮助。
  • 这不是由 .net 框架包装的,pinvoke is required
  • cmd 命令是 powercfg。没有获得睡眠超时的选项,它返回所有关于睡眠的数据(长文本)并且没有直接的超时。关于注册表:我看到的不仅仅是 1 个地方。我找到了一些指南,其中提到了注册表中可以找到超时的不同区域。他们都没有帮助我。 @lan H 我已经看到了,但正如你所见,他没有返回睡眠/休眠超时......只有显示

标签: c# .net winforms


【解决方案1】:

您可以使用 Windows APIRegistry 获取电源高级设置值,包括 Hibernate AfterSleep AfterpowercfgWMI

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

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

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

使用 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 中找到使用注册表或使用 WMI 的示例。

【讨论】:

  • 你是我的救星。现在我了解了这些 guid 并通过该功能成功获得了价值。你给了我 hibrade guid 但我用 powercfg 拿了 sleep guid .. 非常感谢.. 完美的工作顺便说一句注册表没有工作(我的意思是即使我改变了它不会在那里更新的数字)
  • 顺便说一句,感谢您检查注册表解决方案,我修复了它并更新了博客文章并将其从此处删除,因为它使答案不必要地太长了。未来的读者可以在博文中找到它。
猜你喜欢
  • 2019-05-02
  • 1970-01-01
  • 2012-02-17
  • 2011-11-11
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
相关资源
最近更新 更多