Программно развернуть окно на половине экрана

Я хочу развернуть случайное окно в левой части экрана. Могу ли я использовать функции Windows Aero из своего кода? Это окно можно развернуть с помощью мыши. Я просто хочу сделать это программно.

Я использую C# и могу получить IntPtr окна.

По возможности без имитации ввода с помощью мыши или клавиатуры.


person Bitterblue    schedule 19.08.2013    source источник
comment
К сожалению, нет, Microsoft по своей мудрости не предоставила общедоступный API для функциональности aero snap.   -  person Jonathan Potter    schedule 19.08.2013
comment
Это можно сделать без p/invoke, просто не с легкостью,   -  person Nicolas Tyler    schedule 19.08.2013
comment
Разве вы не можете имитировать это поведение, задав положение и размер окна в зависимости от размера рабочего стола? Должно быть достаточно легко, просто не очень чисто   -  person Kippie    schedule 19.08.2013
comment
Просто вызовите MoveWindow().   -  person Hans Passant    schedule 19.08.2013
comment
@HansPassant Сделал это уже в сочетании с ответом Николя. Но я все еще заинтересован в использовании Aero.   -  person Bitterblue    schedule 19.08.2013
comment
Специальной функции Aero для этого нет. Просто нет необходимости, когда вы можете использовать MoveWindow.   -  person Hans Passant    schedule 19.08.2013
comment
Не спорю с @HansPassant или кем-то еще, но MoveWindow не совсем функционально эквивалентен аэродинамической привязке. Если вы аэродинамически прикрепите окно к краю экрана, вы можете дважды щелкнуть его строку заголовка, чтобы восстановить его. Если вы MoveWindow окно сбоку от экрана, двойной щелчок на его строке заголовка развернет его.   -  person Jonathan Potter    schedule 19.08.2013
comment
Вы также можете подделать это, сохранив местоположения перед MoveWindow, а затем выполнить еще один MoveWindow при двойном щелчке окна.   -  person Nicolas Tyler    schedule 21.08.2013


Ответы (3)


Это можно сделать без p/invoke.

Попробуй это:

Rectangle rect = Screen.PrimaryScreen.WorkingArea;
rect.Width = rect.Width / 2;
Bounds = rect;

Это поместит текущее окно слева от основного экрана.

Затем просто добавьте это, чтобы поместить его в правой части экрана.

Location = new Point(rect.Width, 0);
person Nicolas Tyler    schedule 19.08.2013
comment
Я не принял, потому что состояние окна не максимизировано. Пробовал без WinApi (установка FormWindowState и т.д.), но почему-то не получается. - person Bitterblue; 10.12.2014

Это не совсем то же самое, но хорошо подделывает:

ShowWindow(handle, SW_MAXIMIZE);
// for a split second you might see a maximized window here
MoveWindow(handle, 0, 0, Screen.PrimaryScreen.WorkingArea.Width / 2, Screen.PrimaryScreen.WorkingArea.Height, true);
person Bitterblue    schedule 23.08.2013

Потребуется тяжелая работа для размещения в реальном времени, особенно для не дочерних процессов. Пример — www.ishadow.com/vdm. Для ручного «исправления» развернутого окна положение MoveWindow(hWnd, startPos, 0, winWidth, winHeight, true) после ShowWindow(hWnd, SW_MAXIMIZE) обычно (попробуйте Диспетчер задач в Windows 10) работает, как указано выше.

person Alex    schedule 26.12.2017