GetWindowPlacement дает неправильную позицию окна - PullRequest
7 голосов
/ 15 апреля 2011

Как узнать, было ли изменение размера окна с помощью Функция Aero Snap ?GetWindowPlacement Функция дает последний «восстановленный» размер окна.Я использую его следующим образом:

WINDOWPLACEMENT wp = {};
wp.length = sizeof(WINDOWPLACEMENT);
::GetWindowPlacement( hWnd, &wp );

Например, он дает wp.rcNormalPosition = {top=208 bottom=520 left=152 right=510}, когда он должен быть {top=0 bottom=1920 left=152 right=510}.

Пожалуйста, обратите внимание, что GetWindowRect дает точнотот же неверный результат. Это была моя ошибка, GetWindowRect дает правильный результат.

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


Что ж, я сделал несколько тестов с notepad.exe (и некоторыми другими стандартными компонентами Windows), и он сохраняет свое состояние таким же образом - он непомните, было ли это «сломано».Так что я предполагаю, что это предполагаемое поведение программ Windows.

1 Ответ

7 голосов
/ 15 апреля 2011

AeroSnap - это просто еще один тип изменения размера, отправляемый вашему приложению оконным менеджером.Таким образом, вы не узнаете, что это была привязка, а не какой-либо другой тип изменения размера.

Лучшее, на что вы можете надеяться, - это обнаружить, что противоположные края были перемещены в ходе события размера.Вам нужно будет проверить, что высота или ширина изменились, чтобы отличить их от события перемещения.

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


Комментариирассказал больше о вашей проблеме.Вы пытаетесь сохранить положение и размер приложения, когда оно закрывается, чтобы вы могли восстановить его после перезапуска.Вы используете GetWindowPlacement() для этого и обнаружили, что он возвращает неправильную позицию, когда последний размер окна был Aero Snap.

Мое собственное приложение делает то же самое, и я столкнулся с точно таким жепроблема.Решение, которое я использовал, состояло в том, чтобы вызвать GetWindowRect() вместо GetWindowPlacement(), чтобы получить положение и размер окна.Вы заявляете, что это вам не помогает, и в этом случае я понятия не имею, что предложить.Должен сказать, мне трудно поверить, что GetWindowRect() не возвращает правильное окно прямоугольника.

...