Udostępnij za pośrednictwem


Korzystanie z API zasilania urządzenia

Elementy programowania zasilania urządzeń umożliwiają zarządzanie sposobem działania urządzeń, kiedy system znajduje się w stanie uśpienia.

Otwieranie i zamykanie listy urządzeń

Otwieranie i zamykanie listy urządzeń jest kosztownym procesem pod względem czasu procesora CPU. Funkcje DevicePowerOpen i DevicePowerClose, które to robią, są konieczne tylko wtedy, gdy aplikacja musi wielokrotnie wykonywać zapytania dotyczące listy urządzeń.

Jeśli wywołana zostanie DevicePowerOpen, to po zakończeniu zapytań dotyczących listy urządzeń należy wywołać DevicePowerClose. DevicePowerEnumDevices i DevicePowerSetDeviceState nie zamkną listy urządzeń, jeśli została ona jawnie otwarta przez DevicePowerOpen.

Wyliczanie urządzeń

Funkcja DevicePowerEnumDevices wykrywa, czy lista urządzeń jest otwarta, a jeśli nie, otwiera ją. DevicePowerEnumDevices wylicza urządzenia na podstawie określonych kryteriów wyszukiwania. Jeśli lista urządzeń została otwarta przez funkcję, zostanie zamknięta przed zwróceniem funkcji.

Włączanie i wyłączanie możliwości urządzenia do budzenia systemu

Funkcja DevicePowerSetDeviceState, podobna do DevicePowerEnumDevices, wykrywa, czy lista urządzeń jest otwarta, a jeśli nie, otwiera ją. DevicePowerSetDeviceState następnie ustawia określone kryteria dla określonego urządzenia. Jeśli lista urządzeń została otwarta przez funkcję, zostanie zamknięta przed zwróceniem funkcji.

Przykładowy kod

W poniższym przykładzie pokazano użycie interfejsu API zasilania urządzenia.

#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;
}

W tym przykładzie lista urządzeń jest otwierana raz i zamykana raz. Jeśli nie wywołano funkcji DevicePowerOpen i DevicePowerClose, lista urządzeń byłaby otwierana i zamykana przy każdym wywołaniu DevicePowerEnumDevices i DevicePowerSetDeviceState. Za pomocą DevicePowerOpen i DevicePowerClose oszczędziliśmy dwa razy niepotrzebne otwieranie listy urządzeń.