C++コードでシステム解像度を変更する
3610 ワード
仕事の必要性のため、システムの解像度を変更するための小さなツールを作成する必要があります.
ガジェットはマルチディスプレイをサポートする必要があります.各ディスプレイはそれぞれ解像度を設定することができます.
機能は簡単で、きれいにする必要がないので、機能さえ使えばいいので、MFCを使いました(ただ便利のためです)
めちゃくちゃな論理は言わないで、いくつかの肝心な関数だけを言います:
1.列挙システムディスプレイ
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); } } }
これらのコードはすべて直接自分の工事を抜粋して、直接走るのは問題があるべきで、しかし肝心な関数だけを見て十分です
ガジェットはマルチディスプレイをサポートする必要があります.各ディスプレイはそれぞれ解像度を設定することができます.
機能は簡単で、きれいにする必要がないので、機能さえ使えばいいので、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); } } }
これらのコードはすべて直接自分の工事を抜粋して、直接走るのは問題があるべきで、しかし肝心な関数だけを見て十分です