2016-01-27 2 views
5

Il mio problema è abilitare un monitor disabilitato con ChangeDisplaySettingsEx. Immagino non sia una scienza missilistica, ma dopo averla scavata sembra ancora impossibile. Ho trovato un modo per disabilitare tutti gli schermi secondari in base al codice Microsoft trovato campione here. Mentre era necessario solo il minimo aggiustamento di base per funzionare, il riattacco non funzionava mai. Quello che stavo cercando di fare era:Collegare il dispositivo di visualizzazione disabilitato con WinAPI

1. Inizializzare DisplayDevice

BOOL   FoundSecondaryDisp = FALSE; 
DWORD   DispNum = 0; 
DISPLAY_DEVICE DisplayDevice; 
LONG   Result; 
TCHAR   szTemp[200]; 
int    i = 0; 
DEVMODE defaultMode; 
ZeroMemory(&DisplayDevice, sizeof(DisplayDevice)); 
DisplayDevice.cb = sizeof(DisplayDevice); 

2. Trovare tutti i dispositivi

while (EnumDisplayDevices(NULL, DispNum, &DisplayDevice, 0)) 
{ 
    ZeroMemory(&defaultMode, sizeof(DEVMODE)); 
    defaultMode.dmSize = sizeof(DEVMODE); 
    //point 3 goes here 
} 

3. Rileva dispositivo indipendente

if (!(DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) 

4. Attivare dispositivo

DEVMODE DevMode; 
ZeroMemory(&DevMode, sizeof(DevMode)); 
DevMode.dmSize = sizeof(DevMode); 
DevMode.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT; 
DevMode.dmPelsWidth = 1920; 
DevMode.dmPelsHeight = 1080; 
Result = ChangeDisplaySettingsEx(DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY, NULL); 
ChangeDisplaySettingsEx(NULL, NULL, NULL, NULL, NULL); 

rendimenti ultimo punto codice DISP_CHANGE_FAILED e non permette di visualizzazione. Qualcuno ha avuto un'esperienza simile?

+0

Grazie per l'input! Il monitor ** era ** disabilitato con 'ChangeDisplaySettingsEx()', il mio programma di test completo disabilita i display secondari e li prova a riabilitarli, entrambi usando 'ChangeDisplaySettingsEx()'. – Artur

risposta

1

Provare ad aggiungere CDS_NORESET alla prima chiamata a ChangeDisplaySettingsEx.

Questo funziona:

ChangeDisplaySettingsEx((LPCWSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL); 
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL); 

Questo non funziona:

ChangeDisplaySettingsEx((LPCWSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY | CDS_RESET, NULL); 
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL); 

Questo anche non funziona:

ChangeDisplaySettingsEx((LPCWSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY, NULL); 
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL); 
+0

Grazie per la tua risposta! Stavo automatizzando schermi come 2 anni fa, ma forse ne avrò bisogno di nuovo un po 'di tempo;) O forse qualcuno ne avrà bisogno un giorno! – Artur