Condividi tramite


Uso dell'API Power Device

Usare gli elementi di programmazione Device Power per gestire il modo in cui i dispositivi eseguono mentre il sistema si trova in uno stato di sospensione.

Apertura e chiusura dell'elenco di dispositivi

L'apertura e la chiusura dell'elenco dei dispositivi è un processo costoso in termini di tempo della CPU. Le funzioni DevicePowerOpen e DevicePowerClose che eseguono questa operazione sono necessarie solo se l'applicazione deve eseguire una query sull'elenco dei dispositivi più volte.

Se DevicePowerOpen viene chiamato, DevicePowerClose deve essere chiamato quando vengono completate le query dell'elenco di dispositivi. DevicePowerEnumDevices e DevicePowerSetDeviceState non chiuderanno l'elenco dei dispositivi se è stato aperto in modo esplicito da DevicePowerOpen.

Enumerazione dei dispositivi

La funzione DevicePowerEnumDevices rileva se l'elenco di dispositivi è aperto e, in caso contrario, lo apre. DevicePowerEnumDevices enumera i dispositivi in base ai criteri di ricerca specificati. Se l'elenco di dispositivi è stato aperto dalla funzione, viene chiuso prima che la funzione venga restituita.

Abilitazione e disabilitazione di un dispositivo dalla riattivazione del sistema

La funzione DevicePowerSetDeviceState , simile a DevicePowerEnumDevices, rileva se l'elenco di dispositivi è aperto e, in caso contrario, lo apre. DevicePowerSetDeviceState imposta quindi i criteri specificati per il dispositivo specificato. Se l'elenco di dispositivi è stato aperto dalla funzione, viene chiuso prima che la funzione venga restituita.

Codice di esempio

Nell'esempio seguente viene illustrato l'uso dell'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;
}

In questo esempio l'elenco di dispositivi viene aperto una volta e chiuso una volta. Se le funzioni DevicePowerOpen e DevicePowerClose non sono state chiamate, l'elenco dei dispositivi sarebbe stato aperto e chiuso da ogni chiamata a DevicePowerEnumDevices e DevicePowerSetDeviceState. Usando DevicePowerOpen e DevicePowerClose abbiamo salvato l'apertura dell'elenco dei dispositivi due volte non necessari.