Verwenden der Geräte-Power-API
Verwenden Sie die Gerätestrom-Programmierelemente, um die Leistung von Geräten zu verwalten, während sich das System im Ruhezustand befindet.
Öffnen und Schließen der Geräteliste
Das Öffnen und Schließen der Geräteliste ist in Bezug auf die CPU-Zeit ein kostspieliger Prozess. Die Funktionen DevicePowerOpen und DevicePowerClose , die dies tun, 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, und öffnet sie, falls nicht. DevicePowerEnumDevices listet die Geräte basierend auf den 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 an der Aktivierung des Systems
Die DevicePowerSetDeviceState-Funktion , ähnlich wie DevicePowerEnumDevices, erkennt, ob die Geräteliste geöffnet ist, und öffnet sie, falls nicht. 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äteleistungs-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 wurden, wäre die Geräteliste durch jeden Aufruf von DevicePowerEnumDevices und DevicePowerSetDeviceState geöffnet und geschlossen worden. Durch die Verwendung von DevicePowerOpen und DevicePowerClose haben wir das Öffnen der Geräteliste zweimal unnötig gespeichert.