关于电源选项(Power options)

x_tao1984 2009-11-26 11:08:43
各位大侠,小弟有个问题想请教一下:
在windows下怎样获得笔记本电脑电源选项的信息,也就是高级设置的所有信息,像电池,显示,PCI等?
还有xp,vista有什么不一样吗?
好像注册表的HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Power里有,但是看不懂啊。。。
...全文
777 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
x_tao1984 2010-01-13
  • 打赏
  • 举报
回复
一个月前就已经搞定了,忘了结贴
电源选项的所有信息都存在HKEY_LOCAL_MACHINE\SYSTEM\ControSet001\Contol\Power中(Vista/Win7),XP的没找到,但是可以通过CallNTPowerInformation获得。
PowerReadDCValueIndex和PowerReadACValueIndex 可以获得所有的电源管理信息,但是这两个API只支持Vista以后版本
chenyu2202863 2009-11-26
  • 打赏
  • 举报
回复

DWORD GetBatteryState()
{
#define GBS_HASBATTERY 0x1
#define GBS_ONBATTERY 0x2
// Returned value includes GBS_HASBATTERY if the system has a
// non-UPS battery, and GBS_ONBATTERY if the system is running on
// a battery.
//
// dwResult & GBS_ONBATTERY means AC power has not been found.
// dwResult & GBS_HASBATTERY means a non-UPS battery is being used.

DWORD dwResult = GBS_ONBATTERY;

// IOCTL_BATTERY_QUERY_INFORMATION,
// enumerate the batteries and ask each one for information.

HDEVINFO hdev =
SetupDiGetClassDevs(&GUID_DEVCLASS_BATTERY,
0,
0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (INVALID_HANDLE_VALUE != hdev)
{
// Limit search to 100 batteries max
for (int idev = 0; idev < 100; idev++)
{
SP_DEVICE_INTERFACE_DATA did = {0};
did.cbSize = sizeof(did);

if (SetupDiEnumDeviceInterfaces(hdev,
0,
&GUID_DEVCLASS_BATTERY,
idev,
&did))
{
DWORD cbRequired = 0;

SetupDiGetDeviceInterfaceDetail(hdev,
&did,
0,
0,
&cbRequired,
0);
if (ERROR_INSUFFICIENT_BUFFER == GetLastError())
{
PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd =
(PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR,
cbRequired);
if (pdidd)
{
pdidd->cbSize = sizeof(*pdidd);
if (SetupDiGetDeviceInterfaceDetail(hdev,
&did,
pdidd,
cbRequired,
&cbRequired,
0))
{
// Enumerated a battery. Ask it for information.
HANDLE hBattery =
CreateFile(pdidd->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE != hBattery)
{
// Ask the battery for its tag.
BATTERY_QUERY_INFORMATION bqi = {0};

DWORD dwWait = 0;
DWORD dwOut;

if (DeviceIoControl(hBattery,
IOCTL_BATTERY_QUERY_TAG,
&dwWait,
sizeof(dwWait),
&bqi.BatteryTag,
sizeof(bqi.BatteryTag),
&dwOut,
NULL)
&& bqi.BatteryTag)
{
// With the tag, you can query the battery info.
BATTERY_INFORMATION bi = {0};
bqi.InformationLevel = BatteryInformation;

if (DeviceIoControl(hBattery,
IOCTL_BATTERY_QUERY_INFORMATION,
&bqi,
sizeof(bqi),
&bi,
sizeof(bi),
&dwOut,
NULL))
{
// Only non-UPS system batteries count
if (bi.Capabilities & BATTERY_SYSTEM_BATTERY)
{
if (!(bi.Capabilities & BATTERY_IS_SHORT_TERM))
{
dwResult |= GBS_HASBATTERY;
}

// Query the battery status.
BATTERY_WAIT_STATUS bws = {0};
bws.BatteryTag = bqi.BatteryTag;

BATTERY_STATUS bs;
if (DeviceIoControl(hBattery,
IOCTL_BATTERY_QUERY_STATUS,
&bws,
sizeof(bws),
&bs,
sizeof(bs),
&dwOut,
NULL))
{
if (bs.PowerState & BATTERY_POWER_ON_LINE)
{
dwResult &= ~GBS_ONBATTERY;
}
}
}
}
}
CloseHandle(hBattery);
}
}
LocalFree(pdidd);
}
}
}
else if (ERROR_NO_MORE_ITEMS == GetLastError())
{
break; // Enumeration failed - perhaps there are no more items
}
}
SetupDiDestroyDeviceInfoList(hdev);
}

// Final cleanup: If no battery is found, then presume that
// AC power is being used.

if (!(dwResult & GBS_HASBATTERY))
dwResult &= ~GBS_ONBATTERY;

return dwResult;
}

chenyu2202863 2009-11-26
  • 打赏
  • 举报
回复
你查找MSDN 的Power Management相关就知道了
x_tao1984 2009-11-26
  • 打赏
  • 举报
回复
谢谢楼上的这位兄弟
好像通过CallNTPowerInformation这个API可以得到很多相关信息

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧