De Power-API voor apparaten gebruiken
Gebruik de programmeerelementen apparaatstroom om de manier te beheren waarop apparaten presteren terwijl het systeem zich in de slaapstand bevindt.
Het openen en sluiten van de lijst met apparaten is een kostbaar proces in termen van CPU-tijd. De functies DevicePowerOpen en DevicePowerClose die dit doen, zijn alleen nodig als de toepassing meerdere keren een query op de lijst met apparaten moet uitvoeren.
Als DevicePowerOpen wordt aangeroepen, moet DevicePowerClose worden aangeroepen wanneer de queries van de apparatenlijst zijn voltooid. DevicePowerEnumDevices en DevicePowerSetDeviceState zullen de apparaatlijst niet sluiten als deze expliciet is geopend door DevicePowerOpen.
De DevicePowerEnumDevices functie detecteert of de lijst met apparaten is geopend en zo niet, wordt deze geopend. DevicePowerEnumDevices de apparaten opsommen op basis van de opgegeven zoekcriteria. Als de lijst met apparaten door de functie is geopend, wordt deze gesloten voordat de functie wordt geretourneerd.
De functie DevicePowerSetDeviceState, vergelijkbaar met DevicePowerEnumDevices, detecteert of de lijst met apparaten is geopend en zo niet, opent deze. DevicePowerSetDeviceState stelt vervolgens de opgegeven criteria voor het opgegeven apparaat in. Als de lijst met apparaten door de functie is geopend, wordt deze gesloten voordat de functie wordt geretourneerd.
In het volgende voorbeeld ziet u het gebruik van de Power-API voor apparaten.
#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;
}
In dit voorbeeld wordt de lijst met apparaten eenmaal geopend en eenmaal gesloten. Als de functies DevicePowerOpen en DevicePowerClose niet werden aangeroepen, zou de apparaatlijst zijn geopend en gesloten door elke aanroep naar DevicePowerEnumDevices en DevicePowerSetDeviceState. Met behulp van DevicePowerOpen en DevicePowerClose hebben we het openen van de lijst met apparaten twee keer onnodig bespaard.