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