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 在某些计算机上给了我错误的睡眠状态结果。如何获得更准确的结果?的主要内容,如果未能解决你的问题,请参考以下文章
GetExpressCheckoutDetails 在 asp.net 中返回会话过期(10411 错误)(仅在某些计算机上)