2014-11-16 3 views
5

Derzeit habe ich eine Funktion und ich möchte, dass es die Anzahl der aktiven Monitore zurückgibt (mit EnumDisplayDevices).Checking EnumDisplayDevices dwFlags

... 
    DISPLAY_DEVICE dd; 
    dd.cb = sizeof(DISPLAY_DEVICE); 
    while (EnumDisplayDevices(NULL, numberofDeviceAdapters, &dd, EDD_GET_DEVICE_INTERFACE_NAME)) 
    { 
     if (dd.StateFlags == DISPLAY_DEVICE_ACTIVE) 
     { 
      numberOfActiveMonitors++; 
     } 
     numberofDeviceAdapters++; 

    } 
    return numberOfActiveMonitors; 

numberOfActiveMonitors wird nie erhöht, wie kann ich richtig die StateFlags eines DISPLAY_DEVICE überprüfen?

+3

Versuchen Sie 'if (dd.StateFlags & DISPLAY_DEVICE_ACTIVE)' –

+0

Arbeitete brillant, danke! –

Antwort

2

Wenn Sie die MSDN-Dokumentation des DISPLAY_DEVICE data structure lesen, werden Sie, dass beachten Sie:

StateFlags
Gerätezustand Fahnen. Es kann jede sinnvolle Kombination der folgenden sein.
[...]

Also, sollten Sie den binär & (bitweise AND) Operator wenn die desidered Flagge überprüfen verwenden (in Ihrem Fall DISPLAY_DEVICE_ACTIVE) im StateFlags Datenelement des eingangs genannten gesetzt Datenstruktur.

z.B .:

// Your code: 
// if (dd.StateFlags == DISPLAY_DEVICE_ACTIVE) 
// 
// Change to (use binary AND & operator): 
if (dd.StateFlags & DISPLAY_DEVICE_ACTIVE) 
{ 
    ... 
} 

Dies ist ein sehr häufiges Muster in Win32/C++ Programmierung zu überprüfen, ob ein bestimmtes binäres Flag in einem DWORD mehrere Flags enthält, festgelegt ist.

+0

Ich habe versucht, alle Informationen zu lesen und wusste, dass es binär ist, aber manchmal ist es schwierig, das Spezifische zu finden. Wie auch immer, danke für die Erklärung (Genau was ich brauchte)! –

+0

Gern geschehen. Wahrscheinlich hat Ihnen ein minimaler Beispielcode in der MSDN-Dokumentation geholfen. –

Verwandte Themen