Verwenden der Geräte-Power-API
Verwenden Sie die Device Power-Programmierelemente, um die Leistung von Geräten zu verwalten, während sich das System im Energiesparmodus befindet.
Öffnen und Schließen der Geräteliste
Das Öffnen und Schließen der Geräteliste ist ein kostspieliger Prozess in Bezug auf die CPU-Zeit. Die Hierfür erforderlichen Funktionen DevicePowerOpen und DevicePowerClose sind nur erforderlich, wenn die Anwendung die Geräteliste mehrmals abfragen muss.
Wenn DevicePowerOpen aufgerufen wird, muss DevicePowerClose aufgerufen werden, wenn Die Gerätelistenabfragen abgeschlossen sind. DevicePowerEnumDevices und DevicePowerSetDeviceState schließen die Geräteliste nicht, wenn sie explizit von DevicePowerOpen geöffnet wurde.
Enumerieren von Geräten
Die DevicePowerEnumDevices-Funktion erkennt, ob die Geräteliste geöffnet ist. Andernfalls wird sie geöffnet. DevicePowerEnumDevices listet die Geräte anhand der angegebenen Suchkriterien auf. Wenn die Geräteliste von der Funktion geöffnet wurde, wird sie geschlossen, bevor die Funktion zurückgegeben wird.
Aktivieren und Deaktivieren eines Geräts beim Aktivieren und Deaktivieren des Systemaktivierens
Die DevicePowerSetDeviceState-Funktion erkennt ähnlich wie DevicePowerEnumDevices,ob die Geräteliste geöffnet ist. Andernfalls wird sie geöffnet. DevicePowerSetDeviceState legt dann die angegebenen Kriterien für das angegebene Gerät fest. Wenn die Geräteliste von der Funktion geöffnet wurde, wird sie geschlossen, bevor die Funktion zurückgegeben wird.
Beispielcode
Im folgenden Beispiel wird die Verwendung der Geräte-Power-API veranschaulicht.
#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 diesem Beispiel wird die Geräteliste einmal geöffnet und einmal geschlossen. Wenn die Funktionen DevicePowerOpen und DevicePowerClose nicht aufgerufen würden, wäre die Geräteliste durch jeden Aufruf von DevicePowerEnumDevices und DevicePowerSetDeviceStategeöffnet und geschlossen worden. Durch die Verwendung von DevicePowerOpen und DevicePowerClose haben wir das Öffnen der Geräteliste zweimal unnötig gespeichert.