Windows 11 下的 WPF C# MoveWindow 问题

WPF C# MoveWindow issue under Windows 11

提问人:Franck E 提问时间:4/4/2022 最后编辑:Franck E 更新时间:4/4/2022 访问量:417

问:

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

辅助窗口离 PC 太远而无法使用鼠标,因此我有一种方法可以暂时将该特定窗口带到当前主显示器,完成更改,然后将窗口发送回去。

这在 Windows 10 下效果很好,但在 Windows 11 下,窗口似乎消失了,在初次通话期间无处可寻。但是,它可以(从它隐藏的地方)发送回辅助监视器。

下面是一些用于定位窗口的代码(普通 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);
    }
}

以下是我如何将窗口带到当前显示(完美工作 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 的链接

我创建了一个小型 GitHub 项目来说明这个问题。如果您有 2 个屏幕以及 win10 和 11,请从这里获取。

有什么建议吗?

C# WPF Windows-11 移动窗口

评论

0赞 emoacht 4/4/2022
无法看到示例存储库。
0赞 Franck E 4/4/2022
道歉并更正。
0赞 emoacht 4/4/2022
好吧,我想通了。

答:

2赞 emoacht 4/4/2022 #1

据我所知,在 Windows 11 上,WindowState.Maximized 似乎阻止了 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;
}