Windows 11 下的 WPF C# MoveWindow 问题

WPF C# MoveWindow issue under Windows 11

我有一个至少有 2 个独立的应用程序 windows。

副window离PC太远,不能用鼠标,所以我有一个方法,暂时把那个特定的window放到当前的主显示器上,修改完成,然后window 发回。

这在 Windows 10 下运行良好,但在 Windows 11 下,window 似乎消失了,在初始调用期间无处可见。然而,它可以(从它隐藏的任何地方)发送回辅助监视器。

这里是一些定位 window(普通 MoveWindow)的代码:

// Position is assigned in the constructor of the second window
public System.Drawing.Rectangle Position { get; set; }

[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);
    MoveW();
}

public void MoveW()
{
    WindowInteropHelper wih = new(this);
    IntPtr hWnd = wih.Handle;
    if (!Position.IsEmpty)
    {
        _ = MoveWindow(hWnd, Position.Left, Position.Top, Position.Width, Position.Height, false);
    }
}

下面是我如何将 window 带到当前显示(完美运行 Win10):

// Getting the coordinates of the MainWindow
var screen = System.Windows.Forms.Screen.FromHandle(new WindowInteropHelper(App.Current.MainWindow).Handle);
System.Drawing.Rectangle rect = screen.WorkingArea;

// Simply passing them to second window needing to be moved
if (!rect.IsEmpty)
{                            
    var wih = new WindowInteropHelper(this);
    IntPtr hWnd = wih.Handle;
    MoveWindow(hWnd, rect.Left, rect.Top, rect.Width, rect.Height, false);
}

这是 MoveWindow

link

我创建了一个小的 GitHub 项目来说明这个问题。如果你有 2 个屏幕和 wi​​n10 和 11,从 here.

获取它

有什么建议吗?

据我所知,在 Windows 11 上,WindowState.Maximized 似乎阻止 window 在其位置被 MoveWindow 函数更改后显示。

因此,在调用 MoveWindow 之前,工作流程将返回到 WindowState.Normal。它会像下面这样。

WindowState state = this.WindowState;
try
{
    this.WindowState = WindowState.Normal;
    MoveWindow(hWnd, rect.Left, rect.Top, rect.Width, rect.Height, false);
}
finally
{
    this.WindowState = state;
}