Я пытался сделать то же самое, чтобы определить, открылось ли окно за пределами экрана, а затем, соответственно, переместить его в ближайшее место, где оно было ранее найдено. Я просматриваю весь Интернет, и из всех предложенных людьми решений ничего не работает.
Поэтому я взял на себя задачу создать свой собственный класс, который делает именно это и работает на 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) должны работать.
person
Joey Johnson
schedule
19.02.2015