GetWindowPlacement дает неправильную позицию окна

Как узнать, было ли окно изменено с помощью функции 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 ответ

Решение

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

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

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


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

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

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