Как получить аэродинамическое состояние окна?

Когда размер окна изменяется с помощью аэродинамической привязки, User32.GetWindowPlacement(hWnd).rcNormalPosition по-прежнему сохраняет исходный прямоугольник, в то время как User32.GetWindowRect затрагивается.
Поскольку aero snap кажется независимым от WINDOWPLACEMENT, теперь мы не можем собрать полную информацию о фактическом размещении, просто используя user32.dll. Таким образом, мне интересно, есть ли способ получить состояние аэродинамической привязки окна, указывающее , пристыковано ли окно и с какой стороны пристыковано окно.

2 ответа

Aero Snap — это функция оболочки, а не оконной системы. Таким образом, оконная система не может предоставить эту информацию, потому что она не знает об этих состояниях.

И Shell не делает эту информацию доступной. Таким образом, по сути, система не предоставляет состояние Aero Snap любого окна через общедоступный API.

Мне нравится, когда мои главные окна запоминают всю информацию о своем размещении, чтобы ее можно было восстановить при перезапуске. В прошлом было достаточно сохранить копию структуры размещения окна и установить ее обратно при воссоздании окна.

Внедрение оснастки потребовало сохранения некоторой дополнительной информации. Я обнаружил, что окно оказалось захваченным, сравнив его прямоугольник окна с прямоугольником рабочей области монитора, содержащего окно. Если казалось, что он привязан к одному из краев, я записывал это вместе с информацией о размещении. При создании окна я сначала восстанавливаю расположение окна, а затем, если у меня записано состояние привязки, я соответствующим образом изменяю размер и положение окна.

Вы можете отличить окно, которое было привязано к краю монитора, от окна, размер которого был тщательно подобран и размещен там, потому что прямоугольник прикрепленного окна не будет соответствовать прямоугольнику в месте размещения окна.

Этот подход отлично работал в Windows 7. Недавно я обнаружил, что Windows 10 добавила больше гибкости к расположению и размеру привязки, а также добавила больше игр для достижения раздражающе невидимых границ изменения размера. Таким образом, мой код обнаружения не всегда распознает привязку окна, но это должно быть исправлено.

Некоторые популярные программы (например, основные браузеры), кажется, помнят, что они были сняты, и я предполагаю, что они используют тот же подход.

Другие вопросы по тегам