Utilisation de l’API Device Power
Utilisez les éléments de programmation Device Power pour gérer la façon dont les appareils fonctionnent pendant que le système est en veille.
Ouverture et fermeture de la liste des appareils
L’ouverture et la fermeture de la liste des appareils sont un processus coûteux en termes de temps processeur. Les fonctions DevicePowerOpen et DevicePowerClose qui effectuent cette opération ne sont nécessaires que si l’application doit interroger la liste des appareils plusieurs fois.
Si DevicePowerOpen est appelé, DevicePowerClose doit être appelé lorsque les requêtes de liste d’appareils sont terminées. DevicePowerEnumDevices et DevicePowerSetDeviceState ne fermeront pas la liste des appareils s’ils ont été explicitement ouverts par DevicePowerOpen.
Énumération des appareils
La fonction DevicePowerEnumDevices détecte si la liste des appareils est ouverte et, dans le cas contraire, l’ouvre. DevicePowerEnumDevices énumère les appareils en fonction des critères de recherche spécifiés. Si la liste des appareils a été ouverte par la fonction, elle est fermée avant le retour de la fonction.
Activation et désactivation d’un appareil de la veille du système
La fonction DevicePowerSetDeviceState , similaire à DevicePowerEnumDevices, détecte si la liste des appareils est ouverte et, dans le cas contraire, l’ouvre. DevicePowerSetDeviceState définit ensuite les critères spécifiés pour l’appareil spécifié. Si la liste des appareils a été ouverte par la fonction, elle est fermée avant le retour de la fonction.
Exemple de code
L’exemple suivant illustre l’utilisation de l’API Device 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;
}
Dans cet exemple, la liste des appareils est ouverte une fois et fermée une fois. Si les fonctions DevicePowerOpen et DevicePowerClose n’ont pas été appelées, la liste des appareils aurait été ouverte et fermée à chaque appel à DevicePowerEnumDevices et DevicePowerSetDeviceState. En utilisant DevicePowerOpen et DevicePowerClose , nous avons enregistré l’ouverture de la liste des appareils deux fois inutiles.