共用方式為


列舉和顯示控制項

若要列舉電腦上的所有裝置,請呼叫 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 來動態變更設定,而不需要重新開機。