2011-10-14 11 views
6

Voglio contare il numero di display attivi. Per Mac posso usare quanto segue:Come ottengo il numero di visualizzazioni in Windows?

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

Come posso ottenere lo stesso in Windows? Ho trovato EnumDisplayMonitors ma non riesco a capire come usarlo.

+2

La pagina di MSDN si è collegato menziona usando GetSystemMetrics (SM_CMONITORS) per contare il numero di visualizzazioni fisiche. Funziona per te? – IronMensan

risposta

19

Come hai scoperto, lo EnumDisplayMonitors() farà il lavoro ma è un po 'difficile da chiamare. La documentazione indica:

la funzione EnumDisplayMonitors enumera monitor di visualizzazione (inclusa invisibili pseudo-monitor associati con i driver mirroring) che si intersecano una regione formata dall'intersezione di un rettangolo di ritaglio specificato e la regione visibile di un contesto di periferica. EnumDisplayMonitors chiama una funzione di callback MonitorEnumProc definita dall'applicazione una volta per ogni monitor che viene enumerato. Si noti che GetSystemMetrics (SM_CMONITORS) conta solo i monitor di visualizzazione.

Questo ci porta a una soluzione più semplice: GetSystemMetrics(SM_CMONITORS). In effetti questo potrebbe essere anche meglio di EnumDisplayMonitors() se si dispone di monitor psuedo.


come illustrazione di chiamare EnumDisplayMonitors() provare questo:

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

Questo funziona solo a 32 bit per me ... C'è un trucco per lavorare a 64 bit? – alap

+4

Dovrebbe funzionare bene a 64 bit. È molto difficile per chiunque aiutare se non si forniscono ulteriori informazioni su cosa significa "funziona solo" in realtà. –

+0

OK scusa per quello. Io uso lo stesso codice e quando lo compilo con "win32" funziona, con x64 non funziona. Ma ho capito il punto. – alap

2

non testato, ma essenzialmente solo è necessario fornire il callback per la funzione enum:

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); 
    } 
Problemi correlati