GetPwrCapabilities 在某些计算机上给了我错误的睡眠状态结果。如何获得更准确的结果?

Posted

技术标签:

【中文标题】GetPwrCapabilities 在某些计算机上给了我错误的睡眠状态结果。如何获得更准确的结果?【英文标题】:GetPwrCapabilities is giving me wrong sleep state results on some computers. How can I get a more accurate result? 【发布时间】:2011-10-24 16:34:29 【问题描述】:

我有一台 64 位 Win7 Ultimate 计算机,我在其上调用 GetPwrCapabilities。但是它告诉我睡眠状态 4(休眠)不可用并且没有休眠文件。我可以使机器休眠,并且有一个休眠文件。难道我做错了什么?还有什么我可以打电话来获得准确的支持睡眠状态

谢谢

编辑 有趣的是 powercfg -AVAILABLESTATES 提供了正确的信息。有谁知道它调用什么 API 或为什么存在差异

添加代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Xml.Serialization;
using System.IO;
using System.Diagnostics;

class Program

    [DllImport("PowrProf.dll")]
    public static extern bool GetPwrCapabilities(out SYSTEM_POWER_CAPABILITIES lpSystemPowerCapabilities);

    static void Main(string[] args)
    
        SYSTEM_POWER_CAPABILITIES spc;
        bool well = GetPwrCapabilities(out spc);

        Stream stdOut = System.Console.OpenStandardOutput();
        XmlSerializer x = new XmlSerializer(typeof(SYSTEM_POWER_CAPABILITIES));
        x.Serialize(stdOut, spc);
    


[Serializable]
public struct SYSTEM_POWER_CAPABILITIES

    public bool PowerButtonPresent;
    public bool SleepButtonPresent;
    public bool LidPresent;
    public bool SystemS1;
    public bool SystemS2;
    public bool SystemS3;
    public bool SystemS4;
    public bool SystemS5;
    public bool HiberFilePresent;
    public bool FullWake;
    public bool VideoDimPresent;
    public bool ApmPresent;
    public bool UpsPresent;
    public bool ThermalControl;
    public bool ProcessorThrottle;
    public byte ProcessorMinThrottle;
    public byte ProcessorMaxThrottle;
    public bool FastSystemS4;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] spare2;
    public bool DiskSpinDown;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte[] spare3;
    public bool SystemBatteriesPresent;
    public bool BatteriesAreShortTerm;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public BATTERY_REPORTING_SCALE[] BatteryScale;
    public SYSTEM_POWER_STATE AcOnLineWake;
    public SYSTEM_POWER_STATE SoftLidWake;
    public SYSTEM_POWER_STATE RtcWake;
    public SYSTEM_POWER_STATE MinDeviceWakeState;
    public SYSTEM_POWER_STATE DefaultLowLatencyWake;

public struct BATTERY_REPORTING_SCALE

    public UInt32 Granularity;
    public UInt32 Capacity;

public enum SYSTEM_POWER_STATE

    PowerSystemUnspecified = 0,
    PowerSystemWorking = 1,
    PowerSystemSleeping1 = 2,
    PowerSystemSleeping2 = 3,
    PowerSystemSleeping3 = 4,
    PowerSystemHibernate = 5,
    PowerSystemShutdown = 6,
    PowerSystemMaximum = 7

【问题讨论】:

你能告诉我们你的代码吗?您使用的是 C 代码还是 p/invoke?您可能没有正确编组 SYSTEM_POWER_CAPABILITIES 结构。 添加了代码示例。我正在使用 C# 和 PInvoke。我确实得到了一些值,所以有些东西正在起作用,但我想我可能错过了一些东西。那太好了! 【参考方案1】:

bool 被编组为 4 字节。这与 Win32 BOOL 匹配。但是 Win32 BOOLEAN 是一个字节,所以你需要用 [MarshalAs(UnmanagedType.I1)] 标记你所有的 SYSTEM_POWER_CAPABILITIES bool 成员。

【讨论】:

以上是关于GetPwrCapabilities 在某些计算机上给了我错误的睡眠状态结果。如何获得更准确的结果?的主要内容,如果未能解决你的问题,请参考以下文章

Heisenbug:WinApi 程序在某些计算机上崩溃

C 程序在指针运算后崩溃(仅在某些计算机中)

在计算之前删除包含某些值的组合

GetExpressCheckoutDetails 在 asp.net 中返回会话过期(10411 错误)(仅在某些计算机上)

Python 冻结的可执行文件在某些​​计算机上不起作用

在 iframe 中提交的表单在某些计算机上失败