Bonjour,
Je cherche à détecter le passage à la mise en veille (sleep ou hibernate) dans mon application.
Après quelques recherches, j'ai vu que l'on pouvait passer par la classe WMI Win32_PowerManagementEvent
Si la requête renvoie EventType == 4, il s'agit d'un évènement de type "Entering Suspend", ce qui signifie que l'on est en train de passer en veille.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
int eventType = 0;
//init
if(!initializeCOMSecurityAndConnectWMI())
return eventType;
//re-init pEnumerator
m_pEnumerator = NULL;
//Type of change in the system power state.
//http://msdn.microsoft.com/en-us/library/aa394362%28VS.85%29.aspx
if (FAILED(m_pSvc->ExecNotificationQuery (
BSTR(L"WQL"),
BSTR(L"SELECT * FROM Win32_PowerManagementEvent WITHIN 1"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&m_pEnumerator)))
{
return eventType;
}
else
{
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
while (m_pEnumerator)
{
m_pEnumerator->Next(WBEM_NO_WAIT, 1,&pclsObj, &uReturn);
//le problème est ici car uReturn == 0
if(0 == uReturn)break;
VARIANT vtProp;
pclsObj->Get(L"EventType", 0, &vtProp, 0, 0);
eventType = vtProp.uintVal;
VariantClear(&vtProp);
pclsObj->Release();
}
m_pEnumerator->Release();
}
m_pSvc->Release();
CoUninitialize(); |
Le problème, c'est que uReturn == 0 et donc je quitte la boucle directement et je n'arrive pas à récupérer l'EventType.
J'ai également essayé avec
m_pEnumerator->Next(WBEM_INFINITE, 1,&pclsObj, &uReturn);
mais l'exécution s'arrête indéfiniment sur la ligne.
Merci d'avance pour toute idée
Salutations
Partager