Как сохранить размеры и положения окон других приложений при изменении разрешения? (например, в полноэкранную игру и из нее в разрешении не на рабочем столе) - PullRequest
0 голосов
/ 26 марта 2009

Кто-нибудь заметил это странное поведение приложений, использующих D3D или OpenGL, когда они переходят на полноэкранный режим в Windows? Это применимо только тогда, когда приложения переходят в полноэкранный режим, а затем переключаются обратно в окно или завершают работу. Они либо перемещают положения окон других приложений (когда я на компьютере с одним монитором), либо перемещают окна всех других приложений на другой экран, когда я на компьютере с несколькими мониторами.

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

Моя основная настройка по этому поводу - OpenGL / C ++, но я предполагаю, что это применимо к любой вашей настройке, так как она кажется платформой API, о которой нужно позаботиться.


edit : Хорошо, вот еще несколько разъяснений по поводу моего наблюдения. Проблема сохраняется даже при том же разрешении, что и у настольного компьютера. Таким образом, похоже, что это не связано с переключением разрешения, потому что я видел приложения / игры, которые, даже если они не имеют такое же разрешение, как настольный компьютер, когда они переключаются обратно, окна на рабочем столе восстанавливаются, как они были до было запущено полноэкранное приложение.


edit2 : похоже, это проблема переключения разрешения, Windows (по крайней мере, XP), похоже, не помнит положения и размер (в случае настройки нескольких мониторов) окон приложений. Похоже, единственное решение - это то, которое я предоставил в ответе на вопрос - даже если кажется, что ОС должна предоставить что-то, по крайней мере, в виде вызова API или двух. Я до сих пор не убежден, что это единственное решение, должен быть легкий способ изящного, легкого восстановления, нет?

Ответы [ 3 ]

2 голосов
/ 27 марта 2009

Разве вы не должны использовать ChangedDisplaySettingsEx(..., CDS_FULLSCREEN, NULL)? Это сообщит системе, что временный обмен разрешением.

1 голос
/ 26 марта 2009

Я не могу сказать, что на 100% уверен в ситуации, с которой вы столкнулись. Однако, я думаю, это потому, что большинство игр D3D / OpenGL изменяют разрешение вашей машины при запуске / завершении работы из соображений производительности.

Те, которые вы видите, которые не перемешивают окна, вероятно, не меняют разрешение, потому что они могут работать при ваших текущих настройках.

0 голосов
/ 26 марта 2009

Хм, я провел еще несколько исследований по этому поводу - похоже, что по умолчанию не существует запасного варианта восстановления всех размеров и положений работающих окон после изменения разрешения, так что это должно быть сделано из приложения (по крайней мере, в XP).

Итак, чтобы изящно вернуться назад из другого разрешения (например, в полноэкранную игру), мне нужно было бы получить все запущенные приложения hWnd с EnumWindows и соответствующий обратный вызов и сохранить каждое из оконных RECT-структур через GetWindowRect в списке.

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

Конечно, есть и то, что вы наблюдаете, как вы получаете окно hwnd только через EnumWindows и т. Д. Кажется странным, что ОС не предоставляет такую ​​функцию, даже если только API. Интересно, как другие ОС там справляются, если они вообще справляются?

...