程序更改主显示器时VMware全屏窗口自动迁移异常求助
编程更改主显示器时VMware全屏窗口自动迁移的问题
我正尝试在Windows桌面PC上通过编程方式更改主显示器,无论是调用ChangeDisplaySettingsEx、SetDisplayConfig接口,还是用NirSoft MultiMonitorTool执行命令:
.\MultiMonitorTool.exe /SetPrimary <monitor id>
都会出现一个特定问题:全屏状态的VMware控制台窗口会自动迁移到新的主显示器;但通过Windows设置(Windows -> Settings -> Displays)更改时,该窗口不会移动。此问题仅针对VMware全屏窗口,Chrome等其他程序的全屏窗口无此现象。
初始配置
- 显示器1为主显示器(坐标{x=0, y=0})
- 显示器2为扩展显示器(坐标{x=-3040, y=0}),位于显示器1左侧
- VMware Player全屏窗口运行在显示器1上
目标配置
- 显示器2为主显示器(坐标{x=0, y=0})
- 显示器1为扩展显示器(坐标{x=3040, y=0}),位于显示器2右侧
问题现象
通过编程或工具更改主显示器后,VMware窗口会迁移到显示器2;但通过系统设置更改则无此情况。
已尝试的编程方式
ChangeDisplaySettingsEx:采用经典的主显示器切换实现思路SetDisplayConfig:核心实现代码如下:
GetDisplayConfigBufferSizes(QDC.QDC_ONLY_ACTIVE_PATHS, out var pathCount, out var modeCount); DISPLAYCONFIG_PATH_INFO[] paths = new DISPLAYCONFIG_PATH_INFO[pathCount]; DISPLAYCONFIG_MODE_INFO[] modes = new DISPLAYCONFIG_MODE_INFO[modeCount]; QueryDisplayConfig(QDC.QDC_ONLY_ACTIVE_PATHS, ref pathCount, paths, ref modeCount, modes); var newPrimaryMode = modes[primaryMonitorIndex]; var oldPositionOfNewPrimary = newPrimaryMode.sourceMode.position; for (var i = 0; i < modes.Length; i++) { var mode = modes[i]; modes[i].sourceMode.position = new Vanara.PInvoke.POINT( mode.sourceMode.position.X - oldPositionOfNewPrimary.X, mode.sourceMode.position.Y - oldPositionOfNewPrimary.Y); } SetDisplayConfig(pathCount, paths, modeCount, modes, SDC.SDC_APPLY | SDC.SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC.SDC_ALLOW_CHANGES);
待解决问题
- 是否有未尝试的替代编程方案可以避免VMware窗口迁移?
- 是否需要向VMware窗口发送特定消息,阻止其在主显示器切换时自动移动?
- Windows设置更改主显示器的处理逻辑,与编程调用API的核心差异是什么?
环境信息:Windows 10 22H2(旧版本如2019也可复现)、VMware Workstation Player 15.5.7 build-17171714
内容的提问来源于stack exchange,提问作者Călin Darie
相关产品推荐
相关产品推荐

