提问人:Franck E 提问时间:4/4/2022 最后编辑:Franck E 更新时间:4/4/2022 访问量:417
Windows 11 下的 WPF C# MoveWindow 问题
WPF C# MoveWindow issue under Windows 11
问:
我有一个至少有 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,请从这里获取。
有什么建议吗?
答:
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;
}
评论