2012-03-22 9 views
5

Stiamo scrivendo un programma che deve essere in grado di inviare le impostazioni a monitor specifici, richiedendoci di avere identificatori univoci per ciascun dispositivo di visualizzazione. Finora, il meglio che posso ottenere è interrogare un handle sulla struttura DEVMODE restituita da EnumDisplayDevices e vedere se il nome DISPLAY_DEVICE restituito contiene "DISPLAY1" o "DISPLAY2" (supportiamo solo fino a due monitor con questo software e il deviceName il campo della struttura DISPLAY_DEVICE è nella forma di \. \ DISPLAYx dove x è un numero naturale, minimo di 1).In che modo Windows assegna i nomi dei dispositivi di visualizzazione? (ad es. \. DISPLAY1) e determinare le porte di visualizzazione?

Il mio problema è che se qualcuno applica le impostazioni da un terminale a un altro e dice "apporta tutte le mie impostazioni da DISPLAY1 e tutte le mie impostazioni dal mio DISPLAY2 e le applico su DISPLAY1 e DISPLAY2 di un altro terminale", applica le impostazioni ai monitor collegati alle porte corrispondenti? Per quanto ne so, se è collegato un solo monitor, a quel monitor viene assegnato il nome \. \ DISPLAY1 e, se sono collegati due, il dispositivo di visualizzazione collegato tramite DVI è \. \ DISPLAY1 e il dispositivo su VGA è \. \ DISPLAY2.

Ho provato a scollegare i monitor uno alla volta, ricollegandoli in diversi ordini, riavviando, riavviando con solo uno collegato, quindi collegando un secondo, ecc. Ecc., E sembra assegnarli sempre in questo modo. Non riesco a farlo assegnare loro i nomi opposti. Se questo è il caso, allora dovremmo essere OK.

In alternativa, se qualcuno conosce un modo per determinare a livello di codice quale porta a cui è collegato un monitor (DVI o VGA ecc.) Utilizzando le chiamate MSDN, ciò sarebbe ancora più utile. Ho praticamente esaurito tutte le opzioni a cui posso pensare per risolvere questo problema.

Fondamentalmente, sto chiedendo, sono corretto nelle mie ipotesi su come Windows 7 assegna i nomi ai display? Se no, come è fatto? C'è un modo per cambiarlo? Se é cosi, come? C'è un modo per determinare la porta a cui è collegato un monitor?

A proposito, questa applicazione è scritta in C++ utilizzando Qt, se questo è importante.

Grazie.

-Alex alias LeapDayWilliam

+0

Mi sembra esilarante che non ci sia documentazione su questo e nessuno sembra conoscere la risposta, ma apprezzo tutte le opinioni. – LeapDayWilliam

risposta

1

Penso che quello che state cercando è un codice per aiutarvi associare nome canonico di un monitor con la sua posizione fisica. Stavi cercando una soluzione in cui potresti essere in grado di fare questa determinazione guardando i nomi dei dispositivi del monitor, ma questo non è un modo accurato o affidabile per farlo. Dalla mia esperienza non c'è nessuna rima o ragione per lo schema di numerazione per i nomi dei dispositivi di monitoraggio. Quello di cui hai veramente bisogno è un modo per determinare quale monitor si trova fisicamente dove.

Ecco un codice molto semplice per stampare le coordinate X, Y della posizione dei pixel virtuali per il monitor a cui sei interessato. Noterai che se hai due (o più) monitori il valore X di quei monitor aumenteranno in base alla larghezza del monitor a sinistra. È possibile calcolare la posizione fisica di un monitor in base a queste informazioni.

BOOL CALLBACK enumMonitorCallback(
    __in HMONITOR hMonitor, 
    __in HDC hdcMonitor, 
    __in LPRECT lprcMonitor, 
    __in LPARAM dwData 
) 
{ 
    printf("Monitor: %p (X,Y): (%d,%d) (Width, Height): (%d,%d) \n", hMonitor, lprcMonitor->left, lprcMonitor->top, lprcMonitor->right - lprcMonitor->left, lprcMonitor->bottom - lprcMonitor->top); 
    return TRUE; 
} 

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    int nRetCode = 0; 
    BOOL res = EnumDisplayMonitors(NULL, NULL, enumMonitorCallback, NULL); 
    getchar(); 
    return nRetCode; 
} 

La mia macchina ha due monitor. Ottengo questo output:

Monitor: 0x00C005E1 (X,Y): (0,0) (Width, Height): (1280,1024) 
    Monitor: 0x00020001 (X,Y): (1280,0) (Width, Height): (1280,1024) 

Il che mi dice che il monitor con manico 0x00020001 si trova alla destra del primo monitor e viene compensata dalla risoluzione di quel monitor (1280px).

Spero che questo aiuti.

Problemi correlati