Microsoft KB Archive/308216

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

Article ID: 308216

Article Last Modified on 4/4/2006

-

APPLIES TO

 Microsoft Platform Software Development Kit-January 2000 Edition, when used with:  Microsoft Windows XP Professional

 Microsoft Windows 2000 Standard Edition 

-



This article was previously published under Q308216



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.

<div class="moreinformation_section">

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

Keywords: kbdswgdi2003swept kbgdi kbmultimon kbprb KB308216

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.