调查了一个问题,被困扰了很久,希望各位高手可以帮助解决一下:
需求是这样的:主机上接了两个显示器,按键盘上的某一个快捷键,自动切换显示模式:
显示模式: 镜像模式(克隆模式)--> 扩展模式 ; 扩展模式 --> 镜像模式(克隆模式)
切换到扩展模式后,需要单独的设置每个显示器的分辨率,色彩深度,刷新率等。目前,已经可以单独设置每个显示器的各项信息内容,但无法实现显示模式的切换:
如:无法实现从扩展模式 --> 镜像模式(克隆模式)请各位高手,帮忙解决一下,十分感激。

解决方案 »

  1.   

    看下MSDN中关于EnumDisplayMonitors相关API
      

  2.   

    使用了如下的方法,并不能进行显示器模式的切换。
    int ChangeToMirrorMode(vector<DISPLAY_DEVICE> & physicScreenSet, int iSecondaryScreen)
    {
    DEVMODE primaryScreenMode;
    memset(&primaryScreenMode, 0, sizeof(primaryScreenMode));
    primaryScreenMode.dmSize = sizeof(primaryScreenMode);
    EnumDisplaySettings(physicScreenSet[0].DeviceName, ENUM_CURRENT_SETTINGS, &primaryScreenMode);
    memcpy(primaryScreenMode.dmDeviceName, physicScreenSet[0].DeviceName, strlen(physicScreenSet[0].DeviceName) + 1);

    DEVMODE defaultMode;
    //memcpy(&defaultMode, &primaryScreenMode, sizeof(primaryScreenMode));
    memset(&defaultMode, 0, sizeof(defaultMode));
    defaultMode.dmSize = sizeof(defaultMode);
    memcpy(defaultMode.dmDeviceName, physicScreenSet[iSecondaryScreen].DeviceName, sizeof(physicScreenSet[iSecondaryScreen].DeviceName) + 1);
    defaultMode.dmPosition.x = -1440;
    defaultMode.dmPosition.y = 0;
    defaultMode.dmPelsWidth = 1280;
    defaultMode.dmPelsHeight = 1024;
    defaultMode.dmDisplayFlags = DM_INTERLACED;
    defaultMode.dmFields |= DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFLAGS; int detachResult = ChangeDisplaySettingsEx(
    physicScreenSet[iSecondaryScreen].DeviceName, 
    &defaultMode, NULL, CDS_NORESET|CDS_UPDATEREGISTRY, NULL
    ); 
    detachResult |= ChangeDisplaySettingsEx(NULL, NULL, NULL, NULL, NULL); HDC   hScrDC   =   CreateDC(_T("DISPLAY"),   NULL,   NULL,   NULL);   
    HDC   hMemDC   =   CreateCompatibleDC(hScrDC);   
    int   width   =   GetDeviceCaps(hScrDC,   HORZRES);   
    int   height   =   GetDeviceCaps(hScrDC,   VERTRES);   
    HBITMAP   hBmp   =   (HBITMAP)CreateCompatibleBitmap(hScrDC,   width,   height);   
    HBITMAP   hOldBmp   =   (HBITMAP)SelectObject(hMemDC,   hBmp);    return detachResult;
    }