PRB: You Must Restart the Computer After You Use the ChangeDisplaySettingsEx Function to Attach a Secondary Monitor

Article translations Article translations
Article ID: 308216
Expand all | Collapse all

Symptoms

On a Windows 2000 or Windows XP-based system, when you use the ChangeDisplaySettingsEx function to attach a secondary monitor to the desktop, the change does not take effect until you restart the computer.

Cause

This problem occurs on multiple-monitor portable computers that use a dual-view implementation, with which you can use both an external CRT display and the built-in LCD display.

Resolution

To resolve this problem, call ChangeDisplaySettings(NULL, 0) to update the desktop immediately after you call ChangeDisplaySettingsEx to attach the secondary monitor to the desktop. This causes the system to use the settings in the registry and resets each of the display devices.

More information

The following code attaches the first secondary device that it finds to the desktop without requiring you to restart the computer:
BOOL AddUnattachedDisplayDeviceToDesktop()
{
    DWORD DispNum = 0;
    DISPLAY_DEVICE DisplayDevice;
    DEVMODE defaultMode;
    HDC hdc;
    int nWidth;
    BOOL bFoundSecondary = FALSE;

    hdc = GetDC(0);
    nWidth = GetDeviceCaps(hdc,HORZRES);
    ReleaseDC(0,hdc);

    // Initialize DisplayDevice.
    ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
    DisplayDevice.cb = sizeof(DisplayDevice);

    // Get display devices.
    while ((EnumDisplayDevices(NULL, DispNum, &DisplayDevice, 0)) &&
           (bFoundSecondary == FALSE))
    { 
        ZeroMemory(&defaultMode, sizeof(DEVMODE));
        defaultMode.dmSize = sizeof(DEVMODE);
        if (!EnumDisplaySettings((LPSTR)DisplayDevice.DeviceName,
             ENUM_REGISTRY_SETTINGS, &defaultMode))
            return FALSE; // Store default failed

        if (!(DisplayDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE))
        {
            //Found the first secondary device.
            bFoundSecondary = TRUE;
            defaultMode.dmPosition.x += nWidth;
            defaultMode.dmFields = DM_POSITION; 
            ChangeDisplaySettingsEx((LPSTR)DisplayDevice.DeviceName, 
                    &defaultMode, NULL, CDS_NORESET|CDS_UPDATEREGISTRY, NULL); 

            // A second call to ChangeDisplaySettings updates the monitor.
            ChangeDisplaySettings(NULL, 0); 
        } 

        // Reinitialize DisplayDevice. 
        ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
        DisplayDevice.cb = sizeof(DisplayDevice);
        DispNum++;
    } // End while the display devices. 
    return TRUE;
}
				

Properties

Article ID: 308216 - Last Review: June 19, 2014 - Revision: 4.0
Keywords: 
kbdswgdi2003swept kbgdi kbmultimon kbprb KB308216

Give Feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com