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.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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