|
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
|
|
| 15.11.2018, 06:09 | |
|
Ответы с готовыми решениями:
0
Восстановление окон открытых файлов при перезапуске Сохранение и восстановление размеров элементов WPF Список открытых окон |
| 15.11.2018, 06:09 | |
|
Помогаю со студенческими работами здесь
1
Изменить координаты открытых окон Количество открытых окон в windows
Список открытых в XWindow окон Получение названий всех открытых окон Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Почему дизайн решает?
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
Пост отсюда. . .
|