You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

程序更改主显示器时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;但通过系统设置更改则无此情况。

已尝试的编程方式

  1. ChangeDisplaySettingsEx:采用经典的主显示器切换实现思路
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:31:11