C++コードでシステム解像度を変更する

3610 ワード

仕事の必要性のため、システムの解像度を変更するための小さなツールを作成する必要があります.
ガジェットはマルチディスプレイをサポートする必要があります.各ディスプレイはそれぞれ解像度を設定することができます.
機能は簡単で、きれいにする必要がないので、機能さえ使えばいいので、MFCを使いました(ただ便利のためです)
めちゃくちゃな論理は言わないで、いくつかの肝心な関数だけを言います:
1.列挙システムディスプレイ
void CDisplaySettingsDlg::FillDeviceCombo()
{
	m_comboDevices.Clear();
	m_comboDevices.ResetContent();
	DWORD dwAdaptorIndex = 0;
	DISPLAY_DEVICE ddv;
	ZeroMemory(&ddv, sizeof(DISPLAY_DEVICE));
	ddv.cb = sizeof(DISPLAY_DEVICE);

	while (EnumDisplayDevices(NULL, dwAdaptorIndex++, &ddv, 0))
	{
		if (!(ddv.StateFlags&DISPLAY_DEVICE_MIRRORING_DRIVER)
			&& (ddv.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
		{
			m_comboDevices.AddString(ddv.DeviceName);
		}

		ZeroMemory(&ddv, sizeof(DISPLAY_DEVICE));
		ddv.cb = sizeof(DISPLAY_DEVICE);
	}
	m_comboDevices.SetCurSel(0);
}

2.ディスプレイがサポートする解像度を列挙
void CDisplaySettingsDlg::RefreshSettingsCombo() {     ClearSettingsCombo();     CString strDeviceName;     CString strAdd;     m_comboDevices.GetWindowText(strDeviceName);     int currentCX = 0;     int currentCY = 0;     {         DEVMODE dev;         ZeroMemory(&dev, sizeof(dev));         dev.dmSize = sizeof(dev);         if (EnumDisplaySettings(strDeviceName, ENUM_CURRENT_SETTINGS, &dev))         {             currentCX = dev.dmPelsWidth;             currentCY = dev.dmPelsHeight;         }     }     LPDISPLAYOPTION pOptionPre = NULL;     int iModeNum = 0;     while (true)     {         DEVMODE dev;         ZeroMemory(&dev, sizeof(dev));         dev.dmSize = sizeof(dev);         if (EnumDisplaySettings(strDeviceName, iModeNum, &dev))         {             int cx = dev.dmPelsWidth;             int cy = dev.dmPelsHeight;             if (pOptionPre && pOptionPre->IsLike(cx, cy))             {                 iModeNum++;                 continue;             }             LPDISPLAYOPTION pNew = new DISPLAYOPTION(cx, cy);             m_vecOptions.push_back(pNew);             pOptionPre = pNew;
        }         else         {             break;         }         iModeNum++;     }     std::sort(m_vecOptions.begin(), m_vecOptions.end(), DISPLAYOPTION::biggerWidth);     int curSel = 0;     int index = 0;     for (auto opt : m_vecOptions)     {         strAdd.Format(L"%d * %d", opt->cx, opt->cy);         if (opt->cx == currentCX && opt->cy == currentCY)         {             curSel = index; }if(index==0){strAdd+=L"(推奨);        }         m_comboSettings.SetItemDataPtr(m_comboSettings.AddString(strAdd), opt);         index++;     }     m_comboSettings.SetCurSel(curSel); }
解像度を大きくから小さくソートするためにsort関数が表示されるかもしれませんが、デフォルトの列挙順序は小さくから大きく、ちょうどあなたが必要としている場合は、sortとそのエントリをvectorに保存する論理を殺します.私はvectorに保存してsortはソートのためだけです.
3.ユーザーが選択した解像度を適用する
void CDisplaySettingsDlg::OnCbnSelchangeComboSettings() {     int curSel = m_comboSettings.GetCurSel();     CString strDeviceName;     m_comboDevices.GetWindowText(strDeviceName);     if (curSel >= 0)     {         LPDISPLAYOPTION pData = (LPDISPLAYOPTION)m_comboSettings.GetItemDataPtr(curSel);         if (pData)         {             DEVMODE dev;             ZeroMemory(&dev, sizeof(dev));             dev.dmSize = sizeof(dev);             dev.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;             dev.dmPelsWidth = pData->cx;             dev.dmPelsHeight = pData->cy;             ChangeDisplaySettingsEx(strDeviceName, &dev, NULL,                 CDS_GLOBAL | CDS_UPDATEREGISTRY, NULL);         }     } }
 
これらのコードはすべて直接自分の工事を抜粋して、直接走るのは問題があるべきで、しかし肝心な関数だけを見て十分です