首页 > 其他分享 >WinOS下的电源计划设置

WinOS下的电源计划设置

时间:2022-09-19 15:55:11浏览次数:93  
标签:IntPtr Guid WinOS 电源 static 设置 uint GUID ref

在 Windows OS 下电源高级选项中的电源管理计划是按照如下几组 GUID 来进行分类设置的:

  1. PowerActiveScheme GUID
  2. SubGroup GUID
  3. PowerSettingItem GUID

在程序中需要获取或者修改电源计划时,需要使用以上的三个GUID 标识符,各项GUID标识符及计划分组的获取可以通过cmd命令powercfg /Q来获取


一、获取电源计划的值

主要分为 AC、DC 模式下的对应值,流程如下:

  1. powrprof.dll 中导入对应的Win32API
  2. 获取当前的电源计划,及对应的 GUID标识符,如:PowerActiveScheme
  3. 获取对应模式下,对应条目下的具体项值:如:SbuGroup-->PowerSettingItem-->CustomSettingValue
private static Guid GUID_SLEEP_SUBGROUP = new Guid("238c9fa8-0aad-41ed-83f4-97be242c8f20"); //SubGroup: Sleep
private static Guid GUID_STANDBYIDLE = new Guid("29f6c1db-86da-48c5-9fdb-f2b67b1f44da");   
 //Items: Sleep State
private static Guid GUID_HIBERNATEIDLE = new Guid("9d7815a6-7ee4-497e-8888-515a05f02364"); 
 //Items: Hibernate State

[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);

// 获取接电源时,多久进入睡眠(ModernStandby)的时间,单位秒,0表示永不睡眠
public static int GetACSleepTimeOut()
{
    IntPtr activePolicyGuidPTR = IntPtr.Zero;
    uint i = PowerGetActiveScheme(IntPtr.Zero, ref activePolicyGuidPTR);

    Guid activePolicyGuid = Marshal.PtrToStructure<Guid>(activePolicyGuidPTR);
    int type = 0;
    int value = 0;
    uint valueSize = 4u;
    // 使用电池时,则对应于 PowerReadDCValue 
    uint errorRes = PowerReadACValue(IntPtr.Zero,
        ref activePolicyGuid,
        ref GUID_SLEEP_SUBGROUP,
        ref GUID_STANDBYIDLE,
        ref type,
        ref value,
        ref valueSize);

    if (errorRes != 0)
    {
        Console.WriteLine("Read AC Sleep Time failed.");
    }

    return value;
}


二、修改电源计划的值

与获取电源计划的值类似,

  1. powrprof.dll 中导入对应的Win32API
  2. 获取当前的电源计划,及对应的 GUID标识符
  3. 设置对应模式下,对应条目下的具体项值
private static Guid GUID_VIDEO_SUBGROUP = new Guid("7516b95f-f776-4464-8c53-06167f40cc99"); // SubGroup: Display settings
private static Guid GUID_VIDEOIDLE = new Guid("3c0bc021-c8a8-4e07-a973-6b14cbcb2b7e");  // Screen display turn off.

[DllImport("powrprof.dll")]
static extern uint PowerGetActiveScheme(IntPtr UserRootPowerKey, ref IntPtr ActivePolicyGuid);
[DllImport("powrprof.dll")]
static extern uint PowerWriteACValueIndex(
    IntPtr RootPowerKey,
    ref Guid SchemeGuid,
    ref Guid SubGroupOfPowerSettingGuid,
    ref Guid PowerSettingGuid,
    int AcValueIndex);

[DllImport("powrprof.dll")]
static extern uint PowerSetActiveScheme(IntPtr UserRootPowerKey, ref Guid powerSchemeGuid);

// 设置多久后屏幕关闭
public static void SetScreenOffACTime(int seconds)
{
    // 1. Get the current active power scheme and a GUID that identifies the scheme.
    IntPtr powerSchemeGuidPTR = IntPtr.Zero;
    uint errorCode_1 = PowerGetActiveScheme(IntPtr.Zero, ref powerSchemeGuidPTR);
    if (errorCode_1 != 0)
        return;
    Guid powerSchemeGuid = Marshal.PtrToStructure<Guid>(powerSchemeGuidPTR);

    // 2. Set the value for the specified power setting.
    uint errorCode_2 = PowerWriteACValueIndex(IntPtr.Zero,
        ref powerSchemeGuid,
        ref GUID_VIDEO_SUBGROUP,
        ref GUID_VIDEOIDLE,
        seconds);

    if (errorCode_2 == 0)
        PowerSetActiveScheme(IntPtr.Zero, ref powerSchemeGuid); // 必须要调用PowerSetActiveScheme,才能使修改生效
}



【参考资料】

  1. Power button and lid settings overview
  2. PowerWriteACValueIndex function
  3. PowerGetActiveScheme function
  4. Powercfg command-line options

标签:IntPtr,Guid,WinOS,电源,static,设置,uint,GUID,ref
From: https://www.cnblogs.com/Jeffxu/p/16707924.html

相关文章

  • css font-size设置小于12px失效(转)
    原文:https://blog.csdn.net/weixin_38629529/article/details/1198664951、描述不知道你有没有遇到这样的情况,设置了font-size为10px,打开控制台审查元素也显示的是10px,但......
  • vscode 花括号 突出连接线 bracket 两个设置点
    vscode花括号突出连接线bracket两个设置点外观设置设置里面搜索bracketEditor-Guides:HighlightActiveBracketPairEditor-Guides:BracketPairs......
  • 如何设置service中容器的运行环境?环境变量、用户、工作目录?
    0、导语 今天的文章呢,主要为你解决3个问题: 1、如何为service中运行的容器设置环境变量?2、如何指定容器以什么用户执行?3、容器的工作目录(workdir)? 下面咱们一......
  • 设置Oracle连接别名
    设置oracle连接别名设置地址如果是oracleC:\app\Administrator\product\11.2.0\client_1\Network\Admin\tnsnames.ora如果是instance_client其中network和admin需......
  • vscode设置背景图片
    参考:https://blog.csdn.net/lm1022/article/details/121609419file-perferences-settings-extensions-pluginbackgroundconfig-style-editinsettings.json改成下面这......
  • Flask设置logger日志模板
    logger日志模板"""flask设置logger日志统一目录:Myapp/utils/logger.py"""importloggingfromlogging.handlersimportRotatingFileHandlerclassLogger(object):......
  • k8s 的java程序内存设置多大合适 怎么设置
     主要参考的三个博客参考1:https://www.cnblogs.com/xiaoqi/p/container-jvm.html参考2:https://www.imooc.com/article/292785?block_id=tuijian_wz参考3:https://blog.csd......
  • 【C#】设置窗口随意移动
     窗口标题栏隐藏后无法在拖动需要自己获取移动坐标来设置窗口位置  //外部需要两个集变量privatePointmouseOff;//鼠标移动位置变量......
  • 动态设置环境变量
    @echooffsetworkDir=%~dp0setPYTHON_HOME=%workDir%\python-3.7.3-embed-amd64setPATH=%PYTHON_HOME%rem配置src目录的父目录setprojectPath=%workDir%\..\..\..\se......
  • wsl设置开机启动ssh服务
    win10下开启wsl服务(非wsl2)参考博文,修正部分错误linux下的操作打开开机后进入wsl输入sudovi/etc/init.wsl创建文件并且输入下列代码,保存退出输入sudochmod+x......