我试图做同样的事情来检测窗口是否在屏幕外打开,然后相应地将其重新定位到之前找到它的最近位置。我浏览了整个互联网,但人们提供的所有解决方案都没有奏效。
所以我自己做我自己的课程,正是这样做的,它工作 100%。
这是我的代码
public static class ScreenOperations
{
public static bool IsWindowOnAnyScreen(Window Window, short WindowSizeX, short WindowSizeY, bool AutoAdjustWindow)
{
var Screen = System.Windows.Forms.Screen.FromHandle(new WindowInteropHelper(Window).Handle);
bool LeftSideTest = false, TopSideTest = false, BottomSideTest = false, RightSideTest = false;
if (Window.Left >= Screen.WorkingArea.Left)
LeftSideTest = true;
if (Window.Top >= Screen.WorkingArea.Top)
TopSideTest = true;
if ((Window.Top + WindowSizeY) <= Screen.WorkingArea.Bottom)
BottomSideTest = true;
if ((Window.Left + WindowSizeX) <= Screen.WorkingArea.Right)
RightSideTest = true;
if (LeftSideTest && TopSideTest && BottomSideTest && RightSideTest)
return true;
else
{
if (AutoAdjustWindow)
{
if (!LeftSideTest)
Window.Left = Window.Left - (Window.Left - Screen.WorkingArea.Left);
if (!TopSideTest)
Window.Top = Window.Top - (Window.Top - Screen.WorkingArea.Top);
if (!BottomSideTest)
Window.Top = Window.Top - ((Window.Top + WindowSizeY) - Screen.WorkingArea.Bottom);
if (!RightSideTest)
Window.Left = Window.Left - ((Window.Left + WindowSizeX) - Screen.WorkingArea.Right);
}
}
return false;
}
}
用法:ScreenOperations.IsWindowOnAnyScreen(WPFWindow, WPFWindowSizeX, WPFWindowSizeY, true);
这将检查窗口是否完全不在屏幕上,即任务栏下方 1 像素或用户当前显示器下方 1 像素。
如果首先打开,它会检测哪个监视器窗口,因此它应该与多监视器一起使用。
如果窗口在屏幕上,则此方法返回 true,否则返回 false。
最后一个参数用于自动将窗口调整到屏幕上最近的部分。如果您为该参数设置 false ,它将不会为您调整窗口。
因此,这是针对此问题的完整 WPF 解决方案,如果您知道如何操作,WinForm 转换应该很容易,将窗口更改为表单并且FromHandle(Form.Handle)
应该可以工作。