2011-10-14 7 views
6

Quiero contar el número de pantallas activas. Para Mac puedo usar lo siguiente:¿Cómo obtengo la cantidad de pantallas en Windows?

CGDisplayCount nDisplays; 
CGGetActiveDisplayList(0,0, &nDisplays); 
log.printf("Displays connected: %d",(int)nDisplays); 

¿Cómo puedo lograr lo mismo en Windows? He encontrado EnumDisplayMonitors pero no sé cómo usarlo.

+2

La página de MSDN se conectó menciona el uso de GetSystemMetrics (SM_CMONITORS) para contar la cantidad de pantallas físicas. Eso funciona para ti? – IronMensan

Respuesta

19

Como habrás descubierto, EnumDisplayMonitors() hará el trabajo pero es un poco complicado llamar. La documentación indica:

La función EnumDisplayMonitors enumera monitores de visualización (incluyendo invisibles pseudo-monitores asociados con los controladores de espejo) que se cruzan una región formada por la intersección de un rectángulo de recorte especificada y la región visible de un contexto de dispositivo. EnumDisplayMonitors llama a una función de devolución de llamada MonitorEnumProc definida por la aplicación una vez para cada monitor que se enumera. Tenga en cuenta que GetSystemMetrics (SM_CMONITORS) cuenta solo los monitores de visualización.

Esto nos lleva a una solución más fácil: GetSystemMetrics(SM_CMONITORS). De hecho, esto puede ser incluso mejor que EnumDisplayMonitors() si tiene monitores psuedo.


Como ilustración de llamar EnumDisplayMonitors() intente esto:

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) 
{ 
    int *Count = (int*)dwData; 
    (*Count)++; 
    return TRUE; 
} 

int MonitorCount() 
{ 
    int Count = 0; 
    if (EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)&Count)) 
     return Count; 
    return -1;//signals an error 
} 
+0

Esto solo funciona en 32 bits para mí ... ¿Hay algún truco para trabajar en 64 bits? – alap

+4

Debería funcionar bien en 64 bits. Es muy difícil para cualquier persona ayudar a menos que proporcione más información sobre lo que "solo funciona" realmente significa. –

+0

OK, perdón por eso. Uso el mismo código y cuando lo compilo con "win32" funciona, con x64 no funciona. Pero entendí el punto. – alap

2

no ensayado, pero en esencia lo que sólo tendrá que proporcionar la devolución de llamada para la función de enumeración:

int numMonitors = 0; 

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) 
    { 
    //lprcMonitor holds the rectangle that describes the monitor position and resolution) 

    numMonitors++; 
    return true; 
    } 

int main() 
    { 
    EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, NULL); 
    } 
Cuestiones relacionadas