【问题标题】:.NET - setting power options from code.NET - 从代码设置电源选项
【发布时间】:2011-09-17 18:42:44
【问题描述】:

我想用 C# 编写非常简单的代码 - 一个简单的 2 按钮应用程序,它允许我更改关闭盖子时采取的操作。 从“睡觉”到“不行动”,反之亦然。

我发现它以某种方式连接到 WMI - 但没有关于如何实现这一点的实际信息。

我们将不胜感激。

谢谢!

【问题讨论】:

    标签: c# .net windows winforms wmi


    【解决方案1】:

    这是一个非常古老的帖子,但令人惊讶的是,在其他地方很难找到答案。这是我控制电源按钮的解决方案。希望它可以帮助某人。虽然服务于不同的目的,但这篇文章提供了极大的帮助:

    https://www.codeproject.com/Tips/490390/How-to-disable-the-Sleep-button-while-your-code-is

    这里是所有必需的导入。请注意,您有一个 DC 和 AC 值索引,具体取决于平板电脑(在我的情况下)是否使用电池运行。

    [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
    static extern UInt32 PowerWriteDCValueIndex(IntPtr RootPowerKey,
        [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,
        [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,
        [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,
        int AcValueIndex);
    
    [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
    static extern UInt32 PowerWriteACValueIndex(IntPtr RootPowerKey,
        [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,
        [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,
        [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,
        int AcValueIndex);
    
    [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
    static extern UInt32 PowerSetActiveScheme(IntPtr RootPowerKey,
        [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid);
    
    [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
    static extern UInt32 PowerGetActiveScheme(IntPtr UserPowerKey, out IntPtr ActivePolicyGuid);
    
    static readonly Guid GUID_SYSTEM_BUTTON_SUBGROUP = new Guid("4f971e89-eebd-4455-a8de-9e59040e7347");
    static readonly Guid GUID_POWERBUTTON = new Guid("7648efa3-dd9c-4e3e-b566-50f929386280");
    static readonly Guid GUID_SLEEPBUTTON = new Guid("96996bc0-ad50-47ec-923b-6f41874dd9eb ");
    

    这是你的设置方式:

    IntPtr pActiveSchemeGuid;
    var hr = PowerGetActiveScheme(IntPtr.Zero, out pActiveSchemeGuid);
    Guid activeSchemeGuid = (Guid)Marshal.PtrToStructure(pActiveSchemeGuid, typeof(Guid));
    
    hr = PowerWriteDCValueIndex(
         IntPtr.Zero,
         activeSchemeGuid,
         GUID_SYSTEM_BUTTON_SUBGROUP,
         GUID_POWERBUTTON,
         0);
    
    PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid); //This is necessary to apply the current scheme.
    

    这里定义了索引https://msdn.microsoft.com/en-us/library/windows/hardware/mt608287(v=vs.85).aspx

    就是这样。应该加入一些错误保护,但效果很好。

    【讨论】:

      【解决方案2】:

      看看Windows API Code Pack,它是很多 Windows API 的封装。它包括Power Management API

      【讨论】:

        猜你喜欢
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        • 2017-04-05
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        相关资源
        最近更新 更多