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()
не возвращает правильный прямоугольник окна.