2013-10-28 19 views
5

Sto provando a seguire le istruzioni su MSDN given here per disabilitare un monitor secondario.Come disabilitare un monitor secondario (con ChangeDisplaySettingsEx)?

Sto cercando di utilizzare specificamente questo insieme di funzioni per consentire la compatibilità con le versioni precedenti di Windows.

Tuttavia, non riesco a disabilitare un monitor. Sto eseguendo e testando questo su Windows 7 x64. Tutto ciò che ottengo è uno schermo tremolante. Il codice rileva definitivamente il monitor in modo corretto: sono riuscito a modificare la risoluzione e a visualizzare facilmente le sue modalità di visualizzazione.

Ecco (parti) del mio codice - ho provato un sacco di variazioni sui campi di DEVMODE

DEVMODE deleteScreenMode; 
ZeroMemory(&deleteScreenMode, sizeof(DEVMODE)); 
deleteScreenMode.dmSize = sizeof(DEVMODE); 
deleteScreenMode.dmDriverExtra = 0; 
deleteScreenMode.dmFields = DM_POSITION | DM_PELSHEIGHT | DM_PELSWIDTH; 
deleteScreenMode.dmPelsWidth = 0; 
deleteScreenMode.dmPelsHeight = 0; 

POINTL delete; 
deleteion.x=0; 
deleteion.y=0; 
deleteScreenMode.dmPosition = deleteion; 

LONG result = ChangeDisplaySettingsEx(devName, 
             &deleteScreenMode, 
             NULL, 
             CDS_UPDATEREGISTRY, 
             NULL); 

Qualcuno ha esperienza con questo? Grazie

+0

Secondo l'articolo citato, la maschera 'dmFields' contiene più flag. Forse è necessario anche impostare (e azzerare i campi corrispondenti) per staccare il monitor? – valdo

+0

L'ho provato, non ha funzionato. Nel loro esempio usano tutti i possibili flag - quando lo faccio, si lamenta che la modalità data non è valida. Quando rimuovo il flag DM_BITSPERPEL funziona, ma il risultato non cambia. I monitor toccano e rimangono attivi. – Alex

risposta

2

Ho deciso di passare a un altro problema, impostando uno schermo principale e, per pura fortuna, sono incappato nella soluzione. Ci sono 2 condizioni per disabilitare un monitor che non sono specificate da nessuna parte: 1) Non è possibile disabilitare il monitor in modo dinamico - è necessario utilizzare CDS_UPDATEREGISTRY per scriverlo nel registro. 2) Ancora più importante, per qualche strano motivo, è necessario prima memorizzare la modifica nel registro (con o senza CDS_NORESET, non importa), e quindi utilizzare nuovamente ChangeDisplaySettingsEx con valori NULL per rendere effettive le modifiche. Questo potrebbe avere qualcosa a che fare entrambi i monitor collegati allo stesso dispositivo di visualizzazione, non sono sicuro ...

Comunque qui è il codice che ha funzionato per me:

result = ChangeDisplaySettingsEx(devName, &deleteScreenMode, 
             NULL, 
             CDS_UPDATEREGISTRY | CDS_NORESET , 
             NULL); 
ChangeDisplaySettingsEx (NULL, NULL, NULL, NULL, NULL); 

Spero che ti aiuto a qualcuno da qualche parte un giorno.

0

Una soluzione simile è accennato qui:

http://support.microsoft.com/kb/308216

Questo funziona per fissaggio schermi. Tuttavia, anche armati di tale conoscenza, la documentazione di ChangeDisplaySettingsEx su come staccare lo schermo è anche errata sui campi DevMode che devono essere impostati. Come hai notato, devi impostare non solo DM_POSITION, ma anche DM_PELSHEIGHT | DM_PELSWIDTH.

In Windows 7 c'è una nuova API SetDisplayConfig, ma non ho ancora esperienza personale con esso. Spero sia meglio documentato!