Я пытался сделать то же самое, чтобы обнаружить, открылось ли окно за экраном, и, соответственно, переместить его в ближайшее место, где оно было найдено ранее.Я просматриваю весь интернет, и ничего не получалось из всех решений, которые предлагали люди.
Поэтому я взял на себя задачу создать свой собственный класс, который будет заниматься именно этим и работает на 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 пиксель от текущего монитора пользователя.
Он определяет, какой монитор окно, если на первом, поэтому он должен работать с несколькими мониторами.
этот метод возвращает истину, если окно на экране и ложь, если это не так.
ПоследнийПараметр для автоматической настройки окна до ближайшей части экрана для вас.если вы установите false для этого параметра, он не будет настраивать окно для вас.
Так что это полное решение WPF для этой проблемы, и преобразование WinForm должно быть простым, если вы знаете, как это сделать, измените окно наФорма и FromHandle(Form.Handle)
должны работать.