我试图做同样的事情,即检测窗口是否在屏幕外打开,然后将其重新定位到先前找到的最近位置。我在互联网上搜索了很多解决方案,但都没有奏效。
因此,我自己编写了一个类来完成这个任务,它可以完美地工作。
以下是我的代码:
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转换应该很容易,将Window更改为Form并使用
FromHandle(Form.Handle)
即可。
p.X < s.Bounds.Right
。 - Anders Carstensenif(s.Bounds.Contains(p))
。而且在涉及到多显示器时,也许使用s.WorkingArea
会更好,因为边界不一致... - joeforeach
循环,代码如下:var result = Screen.AllScreens.Any(x => x.Bounds.Contains(point));
- Nate W