使用设备 Power API
使用设备电源编程元素来管理系统处于睡眠状态时设备执行的方式。
打开和关闭设备列表
就 CPU 时间而言,打开和关闭设备列表是一个成本高昂的过程。 仅当应用程序需要多次查询设备列表时,才需要执行此操作的 DevicePowerOpen 和 DevicePowerClose 函数。
如果调用 DevicePowerOpen ,则必须在设备列表查询完成时调用 DevicePowerClose 。 如果 DevicePowerEnumDevices 和 DevicePowerSetDeviceState 已由 DevicePowerOpen 显式打开,则不会关闭设备列表。
枚举设备
DevicePowerEnumDevices 函数检测设备列表是否处于打开状态,如果未打开,则将其打开。 DevicePowerEnumDevices 根据指定的搜索条件枚举设备。 如果设备列表由 函数打开,则会在函数返回之前关闭设备列表。
启用和禁用设备以唤醒系统
DevicePowerSetDeviceState 函数(类似于 DevicePowerEnumDevices)检测设备列表是否处于打开状态,如果设备列表未打开,则将其打开。 然后,DevicePowerSetDeviceState 为指定设备设置指定条件。 如果设备列表由 函数打开,则会在函数返回之前关闭设备列表。
示例代码
以下示例演示如何使用设备 Power API。
#define _WIN32_WINNT 0x0600
#include <Windows.h>
#include <PowrProf.h>
#include <stdio.h>
#include <tchar.h>
#pragma comment(lib, "PowrProf.lib")
int __cdecl main()
{
// Define and initialize our return variables.
LPWSTR pRetBuf = NULL;
ULONG bufSize = MAX_PATH * sizeof(WCHAR);
ULONG uIndex = 0;
BOOLEAN bRet = FALSE;
// Open the device list, querying all devices
if (!DevicePowerOpen(0))
{
printf("ERROR: The device database failed to initialize.\n");
return FALSE;
}
// Enumerate the device list, searching for devices that support
// waking from either the S1 or S2 sleep state and are currently
// present in the system, and not devices that have drivers
// installed but are not currently attached to the system, such as
// in a laptop docking station.
pRetBuf = (LPWSTR)LocalAlloc(LPTR, bufSize);
while (NULL != pRetBuf &&
0 != (bRet = DevicePowerEnumDevices(uIndex,
DEVICEPOWER_FILTER_DEVICES_PRESENT,
PDCAP_WAKE_FROM_S1_SUPPORTED|PDCAP_WAKE_FROM_S2_SUPPORTED,
(PBYTE)pRetBuf,
&bufSize)))
{
printf("Device name: %S\n", pRetBuf);
// For the devices we found that have support for waking from
// S1 and S2 sleep states, disable them from waking the system.
bRet = (0 != DevicePowerSetDeviceState((LPCWSTR)pRetBuf,
DEVICEPOWER_CLEAR_WAKEENABLED,
NULL));
if (0 != bRet)
{
printf("Warning: Failed to set device state.\n");
}
uIndex++;
}
// Close the device list.
DevicePowerClose();
if (pRetBuf!= NULL) LocalFree(pRetBuf);
pRetBuf = NULL;
return TRUE;
}
在此示例中,设备列表打开一次,关闭一次。 如果未调用 DevicePowerOpen 和 DevicePowerClose 函数,则每次调用 DevicePowerEnumDevices 和 DevicePowerSetDeviceState 都会打开和关闭设备列表。 通过使用 DevicePowerOpen 和 DevicePowerClose ,我们保存了打开设备列表两次不必要的时间。