Compartir a través de


Uso de Device Power API

Use los elementos de programación Device Power para administrar la forma en que los dispositivos realizan mientras el sistema está en estado de suspensión.

Apertura y cierre de la lista de dispositivos

Abrir y cerrar la lista de dispositivos es un proceso costoso en términos de tiempo de CPU. Las funciones DevicePowerOpen y DevicePowerClose que lo hacen solo son necesarias si la aplicación necesita consultar la lista de dispositivos varias veces.

Si se llama a DevicePowerOpen , se debe llamar a DevicePowerClose cuando se completen las consultas de lista de dispositivos. DevicePowerEnumDevices y DevicePowerSetDeviceState no cerrarán la lista de dispositivos si devicePowerOpen la ha abierto explícitamente.

Enumeración de dispositivos

La función DevicePowerEnumDevices detecta si la lista de dispositivos está abierta y, si no es así, la abre. DevicePowerEnumDevices enumera los dispositivos en función de los criterios de búsqueda especificados. Si la función abrió la lista de dispositivos, se cierra antes de que la función devuelva.

Habilitación y deshabilitación de un dispositivo para reactivar el sistema

La función DevicePowerSetDeviceState , similar a DevicePowerEnumDevices, detecta si la lista de dispositivos está abierta y, si no, la abre. DevicePowerSetDeviceState establece los criterios especificados para el dispositivo especificado. Si la función abrió la lista de dispositivos, se cierra antes de que la función devuelva.

Código de ejemplo

En el ejemplo siguiente se muestra el uso de Device Power API.

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

En este ejemplo, la lista de dispositivos se abre una vez y se cierra una vez. Si no se llamó a las funciones DevicePowerOpen y DevicePowerClose , la lista de dispositivos se habría abierto y cerrado por cada llamada a DevicePowerEnumDevices y DevicePowerSetDeviceState. Al usar DevicePowerOpen y DevicePowerClose , hemos guardado la apertura de la lista de dispositivos dos veces innecesarias.