若要列舉計算機上的所有裝置,請呼叫 EnumDisplayDevices 函式。 傳回的資訊也會指出哪個監視器是桌面的一部分。
若要列舉與裁剪區域交集之桌面上的裝置,請呼叫 EnumDisplayMonitors。 這會傳回每個監視器的 HMONITOR 句柄,此句柄會與 getMonitorInfo 搭配使用,。 若要列舉虛擬畫面中的所有裝置,請使用 EnumDisplayMonitors。 如下列程式代碼所示:
EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
若要取得顯示裝置的相關信息,請使用 EnumDisplaySettings 或 EnumDisplaySettingsEx。
ChangeDisplaySettingsEx 函式是用來控制電腦上的顯示裝置。 它可以修改裝置的設定,例如指定虛擬桌面上監視器的位置,以及變更任何顯示器的位深度。 一般而言,應用程式不會使用此函式。 若要以程式設計方式將顯示監視器新增至多監視器系統,請將 DEVMODE.dmFields 設定為DM_POSITION,併為您要新增的監視器指定位置(使用 DEVMODE.dmPosition)來指定您新增的監視器,該位置與現有監視器至少一個圖元的顯示區域相鄰。 若要中斷鏈接監視器,請將 DEVMODE.dmFields 設定為 DM_POSITION,並將 DEVMODE.dmPelsWidth 和 DEVMODE.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,以動態變更設定,而不需要重新啟動。