共用方式為


列舉和顯示控件

若要列舉計算機上的所有裝置,請呼叫 EnumDisplayDevices 函式。 傳回的資訊也會指出哪個監視器是桌面的一部分。

若要列舉與裁剪區域交集之桌面上的裝置,請呼叫 EnumDisplayMonitors。 這會傳回每個監視器的 HMONITOR 句柄,此句柄會與 getMonitorInfo 搭配使用,。 若要列舉虛擬畫面中的所有裝置,請使用 EnumDisplayMonitors。 如下列程式代碼所示:

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

若要取得顯示裝置的相關信息,請使用 EnumDisplaySettingsEnumDisplaySettingsEx

ChangeDisplaySettingsEx 函式是用來控制電腦上的顯示裝置。 它可以修改裝置的設定,例如指定虛擬桌面上監視器的位置,以及變更任何顯示器的位深度。 一般而言,應用程式不會使用此函式。 若要以程式設計方式將顯示監視器新增至多監視器系統,請將 DEVMODE.dmFields 設定為DM_POSITION,併為您要新增的監視器指定位置(使用 DEVMODE.dmPosition)來指定您新增的監視器,該位置與現有監視器至少一個圖元的顯示區域相鄰。 若要中斷鏈接監視器,請將 DEVMODE.dmFields 設定為 DM_POSITION,並將 DEVMODE.dmPelsWidthDEVMODE.dmPelsHeight 設為零。

下列程式代碼示範如何從桌面中斷連結所有次要顯示裝置:

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

            //The code below shows how to re-attach the secondary displays to the desktop

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

針對每個顯示裝置,應用程式可以在登錄中儲存描述裝置組態參數的資訊,以及位置參數。 應用程式也可以透過 DISPLAY_DEVICE 結構中的DISPLAY_DEVICE_ATTACHED_TO_DESKTOP旗標,判斷哪些顯示器是桌面的一部分,哪些不是。 將所有組態資訊儲存在登錄中之後,應用程式就可以再次呼叫 ChangeDisplaySettingsEx,以動態變更設定,而不需要重新啟動。