You are currently offline, waiting for your internet to reconnect

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

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.
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.
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;}				

Article ID: 308216 - Last Review: 06/19/2014 13:51:00 - Revision: 4.0

  • kbdswgdi2003swept kbgdi kbmultimon kbprb KB308216