Поделиться через


Использование API power для устройств

Используйте элементы программирования Device Power для управления способом работы устройств, когда система находится в спящем режиме.

Открытие и закрытие списка устройств

Открытие и закрытие списка устройств является дорогостоящим процессом с точки зрения времени ЦП. Функции DevicePowerOpen и DevicePowerClose , которые делают это, необходимы только в том случае, если приложению требуется несколько раз запрашивать список устройств.

Если вызывается DevicePowerOpen , при выполнении запросов к списку устройств необходимо вызывать DevicePowerClose . DevicePowerEnumDevices и DevicePowerSetDeviceState не закрывают список устройств, если он был явно открыт с помощью DevicePowerOpen.

Перечисление устройств

Функция DevicePowerEnumDevices определяет, открыт ли список устройств, и в противном случае открывает его. DevicePowerEnumDevices перечисляет устройства на основе указанных условий поиска. Если список устройств был открыт функцией, он закрывается перед возвратом функции.

Включение и отключение пробуждения устройства в системе

Функция DevicePowerSetDeviceState , аналогичная DevicePowerEnumDevices, определяет, открыт ли список устройств, и, если нет, открывает его. Затем DevicePowerSetDeviceState задает указанные критерии для указанного устройства. Если список устройств был открыт функцией, он закрывается перед возвратом функции.

Пример кода

В следующем примере показано использование API power для устройств.

#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 мы сохранили открытие списка устройств два ненужных раза.