PROBLEMA: ChangeDisplaySettingsEx não desanexar um monitor na área de trabalho

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 306399
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Quando você chamar a função ChangeDisplaySettingsEx no Microsoft Windows 95, Windows 98, Windows 98 Second Edition ou sistema operacional Windows Millennium Edition (Me) para desanexar um monitor secundário da área de trabalho, o monitor não irá desanexar imediatamente da área de trabalho. A chamada ChangeDisplaySettingsEx atualiza as configurações do Registro para que a atualização é vista na próxima vez em que o sistema operacional é iniciado. No entanto, esse problema não ocorre no Windows NT e Windows 2000.
Resolução
DEVMODE deve ser configurado corretamente e os campos de propriedade da estrutura DEVMODE devem ser definidos como 0 antes de chamar ChangeDisplaySettingsEx . Além disso, em ordem para a exibição a ser desconectado imediatamente sem a necessidade de reiniciar o sistema operacional, você deve chamar ChangeDisplaySettingsEx duas vezes.
Mais Informações
Estrutura DEVMODE, você precisa definir as entradas DEVMODE dos sinalizadores a seguir como zero no dmFields antes de chamar ChangeDisplaySettingsEx :
DM_PELSWIDTH
DM_PELSHEIGHT
DM_BITSPERPEL
DM_POSITION
DM_DISPLAYFREQUENCY
DM_DISPLAYFLAGS
Observação : você deve salvar o DEVMODE atual chamando EnumDisplaySettings para que você pode anexar o monitor de volta para a área de trabalho utilizando outra chamada para ChangeDisplaySettingsEx .

O código a seguir demonstra como desanexar todos os dispositivos de vídeo secundário da área de trabalho:
void DetachDisplay(){    BOOL            FoundSecondaryDisp = FALSE;    DWORD           DispNum = 0;    DISPLAY_DEVICE  DisplayDevice;    LONG            Result;    TCHAR           szTemp[200];    int             i = 0;    DEVMODE   defaultMode;    // initialize DisplayDevice    ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));    DisplayDevice.cb = sizeof(DisplayDevice);    // get all display devices    while (EnumDisplayDevices(NULL, DispNum, &DisplayDevice, 0))        {        ZeroMemory(&defaultMode, sizeof(DEVMODE));        defaultMode.dmSize = sizeof(DEVMODE);        if ( !EnumDisplaySettings((LPSTR)DisplayDevice.DeviceName, ENUM_REGISTRY_SETTINGS, &defaultMode) )                  OutputDebugString("Store default failed\n");        if ((DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) &&            !(DisplayDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE))            {            DEVMODE    DevMode;            ZeroMemory(&DevMode, sizeof(DevMode));            DevMode.dmSize = sizeof(DevMode);            DevMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION                        | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS ;            Result = ChangeDisplaySettingsEx((LPSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY, NULL);            Result = ChangeDisplaySettingsEx((LPSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY, NULL);            //The code below shows how to re-attach the secondary displays to the desktop            //ChangeDisplaySettingsEx((LPSTR)DisplayDevice.DeviceName, &defaultMode, NULL, CDS_UPDATEREGISTRY, NULL);            //ChangeDisplaySettingsEx((LPSTR)DisplayDevice.DeviceName, &defaultMode, NULL, CDS_UPDATEREGISTRY, NULL);                        }        // Reinit DisplayDevice just to be extra clean        ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));        DisplayDevice.cb = sizeof(DisplayDevice);        DispNum++;        } // end while for all display devices}				

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 306399 - Última Revisão: 12/06/2015 04:58:38 - Revisão: 1.5

Microsoft Platform Software Development Kit-January 2000 Edition

  • kbnosurvey kbarchive kbmt kbdswgdi2003swept kbgdi kbmultimon kbprb KB306399 KbMtpt
Comentários