4 ms·
I thought ChangeDisplaySettingsEx and EnumDisplaySettings are superseded by SetDisplayConfig and QueryDisplayConfig, respectively? https://github.com/MicrosoftD
by CrendKing 4y ago
I thought ChangeDisplaySettingsEx and EnumDisplaySettings are superseded by SetDisplayConfig and QueryDisplayConfig, respectively? https://github.com/MicrosoftDocs/windows-driver-docs/blob/staging/windows-driver-docs-pr/display/scaling-the-desktop-image.md https://github.com/MicrosoftDocs/windows-driver-docs/blob/st... calls ChangeDisplaySettingsEx "legacy API".
From my experience, changing topology using SetDisplayConfig is straightforward.
- michidk 4y agoBut I don't see a way to set the primary display using those calls, or am I missing something?
- CrendKing 4y agoWhichever monitor's position is set to (0, 0) is the primary monitor. The following code assumes you have two monitors, and swaps the primary. Of course, to be more robust, you should not hard code the indices but do checking on the info types. let mut num_paths = MaybeUninit::uninit(); let mut num_mode_infos = MaybeUninit::uninit(); GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, num_paths.as_mut_ptr(), num_mode_infos.as_mut_ptr()); let mut paths = vec![Default::default(); num_paths.assume_init() as _]; let mut mode_infos = vec![Default::default(); num_mode_infos.assume_init() as _]; QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, num_paths.as_mut_ptr(), paths.as_mut_ptr(), num_mode_infos.as_mut_ptr(), mode_infos.as_mut_ptr(), null_mut()); (mode_infos[1].Anonymous.sourceMode.position, mode_infos[3].Anonymous.sourceMode.position) = (mode_infos[3].Anonymous.sourceMode.position, mode_infos[1].Anonymous.sourceMode.position); SetDisplayConfig(&paths, &mode_infos, SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_ALLOW_CHANGES);