Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Подсказки / Как избежать сворачивания полноэкранной windows-игры в многомониторной конфигурации.

Как избежать сворачивания полноэкранной windows-игры в многомониторной конфигурации.

Автор:

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

Для решения проблемы у API есть штатное средство — функция ClipCursor, устанавливающая для мыши рабочую область экрана.

Использовать функцию проще простого:

// сохраняем текущий объект отсечения
LPRECT mSavedCursorClip;
GetClipCursor(&mSavedCursorClip);

//...

// устанавливаем новый объект отсечения
RECT mNewCursorClip;
SetRect(&mNewCursorClip, 0, 0, 1024, 768);
ClipCursor(&mNewCursorClip);

И не забываем ставить код восстановления и установки новой области отсечения в соответствующие обработчики minimize, restore и завершения приложения.

27 ноября 2010

Комментарии:
~X~Постоялецwww7 янв. 201113:29#1
Не совсем понятно: этот код просто не даёт курсору выйти за пределы игорого экрана? Или после restore/resize не даёт курсору "рассихронизироваться" с игровым (как в oblivion, например)?
Просто лично мне до сих пор не удалось заставить fullscreen-приложение вести себя нормально на одном мониторе, когда я перевожу курсор на второй монитор и что-то там нажимаю (winamp, например :) ).
ZПостоялецwww7 янв. 201115:13#2
Ето для самой игръ, да.
А для разработки охота перевести на второй монитор И чтобъ игра не свернулась.
Ето можно сделать, запомнив адрес процедуръ обработки сообщений окошка перед CreateDevice(), потом после (так как Direct3D рантайм ставит свой обработчик поверх нашего) и поставить новъй обработчик, которъй в случае WM_ACTIVATEAPP просто передает сообщение нашему старому обработчику, все остальнъе - тому что после CreateDevice() взяли.
Таким образом отключаем Direct3D рантайм из обработки етого мессиджа и все работает.
vlobПостоялецwww7 янв. 201116:41#3
~X~
просто не дает выйти за пределы экрана.

>Просто лично мне до сих пор не удалось заставить fullscreen-приложение вести себя нормально на одном мониторе, когда я перевожу курсор на второй монитор и что-то там нажимаю (winamp, например :) ).
да, еще иногда хочется быстро альттабнуться в приложение на другом монике и что-нибудь там сделать, потом вернуться и чтобы без сворачивания.
пока ни в одной fullscreen игре не видел подобного.

Z
зачем дебажить в фулскрине?
а в релизе ты применял описанный способ?
а devicelost и потеря ресурсов,может произойти в твоем способе? (я не знаю, как генерится devicelost)
напиши хинт :)

ZПостоялецwww7 янв. 201118:17#4
vlob
>зачем дебажить в фулскрине?
Чтобъ дебажит фулскрин. Чтобъ имея 2 монитора, воспользоватся максимально одним из них.
Device lost произходит.
@!!exПостоялецwww7 янв. 201118:55#5
Хм. Я делаю фулскрин игры для многомониторных конфигураций и у мну ничего не сворачивается при клике за пределами окна без всяких извратов... Я чего-то не так делаю?????
ZПостоялецwww7 янв. 201119:08#6
@!!ex
А какая версия DirectX-а?
@!!exПостоялецwww7 янв. 201119:23#7
Так вы про DX... Надо было догадаться.... я на OGL пишу. Сорри за офтом. В теме не увидел упоминания DX.
shekhПостоялецwww7 янв. 201123:28#8
Z

>Таким образом отключаем Direct3D рантайм из обработки етого мессиджа и все работает.

А это идея! спасибо. А нет ли у кого исходника directx-обработчика окна, или типа реверса?
Кстати я правильно понимаю что в таком случае если мы переключимя например на блокнот который тоже на втором мониторе, то мы его не увидим?

мысли по теме:
Очень жаль что в координатах окон отсутствует такая величина как монитор. (Или может я лениво искал, есть функция SetWindowMonitor?).
Пару раз мне удавалось настроить т.н. "dualview", когда второй моник просто есть но десктоп на него не выводится и никакие окна не лезут. И при этом в dx его можно выбрать в полном экране и получался эксклюзивный монитор приложения. Как при этом dx договоривался с окном непонятно, может там оно просто не играет роли. (А может мне только чудится что так было, в любом случае все это постоянно в драйверах ломается).

Обычно все мониторы зашарены на десктоп. Если бы я сейчас дизайнил window manager, я бы сказал что окно должно всегда иметь координаты в "системе десктопа", независимо от временного режима монитора. Например (1280,0,2560,1024), несмотря на то что режим 1024x768. Тогда при смене режима (временного) никакие окна не передвигаюся, иконки остаются на своих местах - потому что с точки зрения десктопа ничего не изменилось. А в случае всяких кликов window manager должен проверить, не мешает ли новому активному окну это окно с полноэкранным режимом (1280,0,2560,1024), и только если мешает - выключать режим и т.п.
Но все не так :(

/ Форум / Программирование игр / Графика

Тема в архиве.

2001—2017 © GameDev.ru — Разработка игр