С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044

Proxy DLL: Сохранение и восстановление позиций и размеров открытых окон

15.11.2018, 06:09. Показов 800. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

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

Я фанат квестов. Захотелось мне тут недавно перепройти одну из моих любимых серий - Runaway. Однако при прохождении второй части серии я столкнулся с проблемой: есть в игре одна локация, где на Windows 10 наблюдаются жуткие тормоза. Пошерстив интернет, я понял, что не один такой везучий. На официальном форуме сообщества Steam наткнулся (внезапно!) на ссылку на хабре, в которой описывалось создание Proxy DLL для запуска полноэкранных DirectDraw-приложений в окне. Взял DLL, положил куда надо, запустил - работает, не тормозит, в общем, всё шикарно.
Почти всё. Всё-таки, на Full HD мониторе играть в окне с разрешением 1024x768 такое себе удовольствие. Я, недолго думая, решил модифицировать код Proxy DLL (благо, на хабре и ссылочка на исходники имеется) так, чтобы при загрузке разрешение экрана менялось на требуемое, а при выгрузке восстанавливалось исходное (собственно, исходя из наблюдений, сама игра по дефолту так и делает: видно, что после запуска экзешника разрешение сначала меняется, некоторое время видно скукоженный рабочий стол, а уже затем появляется вступительный ролик). Использовал для этого функции EnumDisplaySettings и ChangeDisplaySettings. Собрал, заменил DLL, запустил - огонь, со стороны поведение стало такое же, какое было до плясок с прокси: разрешение меняется, игра запускается (по-прежнему в окне, но, поскольку разрешение экрана совпадает с размерами окна, кажется, что игра запущена в полноэкранном режиме), но при этом не тормозит там, где тормозила раньше, а при выходе разрешение экрана восстанавливается!
Но разве можно победить в себе перфекциониста? На этот раз мне не понравилось то, что окна всех открытых в момент запуска игры приложений скукоживаются до того размера, чтобы влезть в 1024x768, и не раскукоживаются обратно после восстановления разрешения...

И вот тут у меня встаёт основной вопрос:
Каким способом можно сделать восстановление размеров открытых окон после смены разрешения экрана? Возможно, есть какой-то способ сделать это неявно (ну или не совсем явно, возможно, какой-то флажок в ChangeDisplaySettings)? Или нужно делать это вручную, пробежавшись по всем открытым окнам через EnumWindows, сохранить их позиции и размеры при загрузке DLL, а при выгрузке восстановить обратно? Я попробовал второй способ, что что-то он у меня не взлетел... Кроме того, при его использовании после выхода из игры ещё какое-то время висит чёрное окно, оставшееся от неё - видимо, в этот момент как раз производятся попытки восстановить позиции окон, но что-то подозрительно долго это происходит, кроме того, позиции и размеры в итоге не восстанавливаются.
И второй вопрос: сейчас я храню все данные, нужные для восстановления при выгрузке библиотеки, в глобальных переменных. Возможно, есть какой-то более правильный способ сохранять состояния между вызовами DllMain?
Кроме того, у меня не получилось использовать в коде плюсовые контейнеры (падает линковка), приходится управлять памятью вручную. Есть какой-то способ слинковать DLL с stdlib (подозреваю, что-то надо сделать в настройках проекта, но ещё не искал информацию про это).

P.S. У меня вообще, от слова совсем, нет опыта разработки ни DLL, ни кода с использованием WinAPI (первая половина моей карьеры была связана с системной разработкой под Linux, вторая, по сегодняшний день, с кроссплатформенной разработкой, чисто под Windows писать никогда не приходилось), поэтому весь этот нано-проект, по большому счёту, делается методом научного тыка, пристального вглядывания, поверхностного чтения официальной документации WinAPI, проб и ошибок. У меня нет цели сделать прямо продакшен-риди код, но сделать его хотя бы более-менее по уму хочется.

Всем заранее спасибо (хотя бы за то, что нашли в себе силы прочесть эту портянку)!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2018, 06:09
Ответы с готовыми решениями:

Восстановление окон открытых файлов при перезапуске
Слышал, что можно сделать, чтобы некоторые не закрытые окна сами открывались в следующем запуске винды, как и окна проводника. Но не помню,...

Сохранение и восстановление размеров элементов WPF
Всем привет. В WinForm я сохранял размеры. А вот в WPF что то сразу не въезжаю. Есть форма, у которой грид разделен на три столбца. В...

Список открытых окон
Добрый вечер! Собираюсь писать менеджер окон, Qt предоставляет возможность увидеть все открытые окна? или через винапи дескрипторы как то...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2018, 06:09
Помогаю со студенческими работами здесь

Изменить координаты открытых окон
Здравствуйте. Я хочу при помощи С# приложения изменить координаты всех открытых окон. В интернете я нашел функцию...

Количество открытых окон в windows
Для одного проекта нужно кол-во открытых окон в windows, и я хотел узнать, с помощью какой библиотеки для python можно реализовать данную...

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

Список открытых в XWindow окон
Всем привет:) Требуется написать программу, примитивную панель задач -- должна выводить список открытых в данный момент окон. Знаю про...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru