배터리 디바이스 열거
로컬 컴퓨터에서 배터리 디바이스를 열거하려면 SetupDiGetClassDevs 함수를 사용합니다. ClassGuid 매개 변수는 GUID_DEVCLASS_BATTERY 대한 포인터입니다(BatClass.h에 정의됨). 모든 배터리를 열거하려면 Enumerator 매개 변수를 NULL로 설정하고 Flags 매개 변수를 DIGCF_PRESENT DIGCF_INTERFACEDEVICE | 설정합니다. 배터리 디바이스의 이름을 가져오려면 반환된 데이터에 SetupDiEnumDeviceInterfaces 및 SetupDiGetDeviceInterfaceDetail 함수를 사용합니다. 각 배터리 디바이스에 대한 파일 핸들을 열려면 다음 이름으로 CreateFile 함수를 호출합니다.
다음 C++ 예제에서는 로컬 컴퓨터에서 배터리 디바이스를 열거하는 방법을 보여줍니다.
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 we have not yet found AC power.
// dwResult & GBS_HASBATTERY means we have found a non-UPS battery.
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 we're out of items
}
}
SetupDiDestroyDeviceInfoList(hdev);
}
// Final cleanup: If we didn't find a battery, then presume that we
// are on AC power.
if (!(dwResult & GBS_HASBATTERY))
dwResult &= ~GBS_ONBATTERY;
return dwResult;
}
원격 컴퓨터에 연결된 배터리 디바이스를 열거하려면 클라이언트 스크립트 또는 애플리케이션에서 Win32_Battery WMI 클래스를 사용합니다.
관련 항목