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

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

15.11.2018, 06:09. Показов 798. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
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 считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru