2014-05-06 17 views
6

Ho bisogno di aiuto su come recuperare le risoluzioni dei miei schermi, come mostrato nell'immagine qui sotto.Come ottengo le dimensioni (risoluzione) di ciascun display?

one 1680x1050, another 1366x768, and a third 1280x800

ho trovato this documentation ed è stato davvero utile. Ecco il codice che ho provato, sulla base di tali documenti:

int numberOfScreens = GetSystemMetrics(SM_CMONITORS); 
int width   = GetSystemMetrics(SM_CXSCREEN); 
int height   = GetSystemMetrics(SM_CYSCREEN); 

std::cout << "Number of monitors: " << numberOfScreens << "\n"; // returns 3 
std::cout << "Width:"    << width   << "\n"; 
std::cout << "Height:"    << height   << "\n"; 

Tuttavia, solo identifica e fornisce informazioni sul monitor principale . Come posso ottenere informazioni sugli altri monitor?

+1

si potrebbe desiderare di leggere su [enumerazione e display di controllo] (http://msdn.microsoft.com/en- us/library/windows/desktop/dd162617% 28v = vs.85% 29.aspx). –

risposta

4
#include <Windows.h> 

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, 
           HDC  hdcMonitor, 
           LPRECT lprcMonitor, 
           LPARAM dwData) 
{ 
    MONITORINFO info; 
    info.cbSize = sizeof(info); 
    if (GetMonitorInfo(hMonitor, &info)) 
    { 
     std::cout << "Monitor x: "<< std::abs(info.rcMonitor.left - info.rcMonitor.right) 
        <<" y: "  << std::abs(info.rcMonitor.top - info.rcMonitor.bottom) 
        << std::endl; 
    } 
    return TRUE; // continue enumerating 
} 

int main() 
{ 
    EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, 0); 

    return 0; 
} 
+0

Grazie. Questo è quello che volevo. – benjtupas

2

Per enumerare tutti i dispositivi collegati al computer, chiamare lo EnumDisplayDevices function ed elencare i dispositivi. Quindi chiamare EnumDisplayMonitors. Restituisce un handle per ogni monitor (HMONITOR), che viene utilizzato con GetMonitorInfo.

È anche possibile utilizzare WMI Win32_DesktopMonitor class, se il sistema operativo è Windows XP SP2 o successivo (non riesce in SP1).

Inoltre, è possibile provare a utilizzare i valori EDID dal registro per ottenere le dimensioni, ma in molti casi il valore EDID non è valido.

Registro percorso

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAY

+0

Mi piace come la tua risposta ha tentato di * spiegare * la soluzione, piuttosto che pubblicare un dump di codice come l'altro. Ma devo cavillare con la tua soluzione proposta. A che serve chiamare 'EnumDisplayDevices' prima di chiamare' EnumDisplayMonitors'? Solo quest'ultimo dovrebbe essere sufficiente qui, giusto? –

+0

Basta navigare nel percorso di registro sottostante HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAY, mostrerà tutti i dispositivi di visualizzazione che sono collegati al sistema e ci sarà una voce che è valida per la sessione corrente. Allo stesso modo WMI offre anche più di un risultato per i desktop, uno sarà predefinito e uno sarà quello corrente che viene utilizzato. Non sono sicuro del motivo per cui riceviamo più monitor molto probabilmente potrebbe tracciare il record del numero di monitor collegati fino alla data nella CPU – DNamto

+0

Sì, tiene traccia di tutti i monitor che sono stati collegati. Ho 15+ voci sotto quella chiave di registro. Niente di tutto ciò risponde alla domanda sul perché sia ​​necessario chiamare "EnumDisplayDevices", invece di chiamare semplicemente "EnumDisplayMonitors". –