Задача: необходимо установить шрифт для меню, заголовка окна, статусбара и т.д. только для одной программы.
Данный вопрос уже поднимался на форуме, но лучшее, решение, которое я видел, — рисовать окно самому — это, конечно, гемор. К тому же сложно сопровождать и поддерживать для различных версий ОС... Хотелось бы более универсальное решение.
У меня возникла следующая идея. Приложение откуда-то эти данные (шрифты) получает. Следовательно можно перехватывать некие вызовы API, с помощью которых программа получает описания шрифтов, и возвращать ему необходимый шрифт. По идее, это всё, что нужно — другие программы по прежнему будут рисовать шрифтами, установленными в системе, а моя программа будет рисовать моим шрифтом.
Но на практике возникли проблемы. Пытаюсь перехватывать вызовы SystemParametersInfoA/W(SPI_GETNONCLIENTMETRICS, ...) и RegQueryValueExA/W() к ветке "HCU\Control Panel\Desktop\WindowMetrics" (методом научного тыка вроде это там лежит). Для начала попытался подменить шрифт для всех процессов — ставлю глобальный хук и ставлю в начале функции jmp на мою, т.е. все вызовы к этим функциям должны перехватываться... далее рассылаю всем приложениям WM_SETTINGCHANGE, что бы они обновили настройки.
В результате, у части приложений шрифт установился мой, у части — нет. Например, Explorer главное меню рисует моим шрифтом, выпадающее меню Favorites — моим, а все остальные выпадающие меню системным... В программе, в которой собственно это и надо сделать (стандартное MFC приложение) вообще мой шрифт не устанавливается.
Хотелось бы услышать все мнения и предложения на этот счёт: как ещё приложения могут получать эту информацию, может перехватывать надо как-то не так, кто и как рисует главное меню, почему часть меню в Explorer изменилась, а часть нет...
Я думаю решение данной проблемы будет интересно многим, хотя бы с точки зрения получения опыта.
Заранее спасибо всем откликнувшимся, remark
Ни у кого никаких мыслей не возникло?
С перехватом API вызовов, я думаю не получалось, т.к. это происходило где-то внутри ядра, где перехватить уже нельзя.
Здравствуйте, multiarc, Вы писали:
M>А инжект в 1 процесс это проблема?
Т.е. поставленный топик-стартером вопрос — для Вас и не задачка вовсе, а пройденный этап ?
Тогда (поскольку изменение шрифта в общем случае означает и изменение размеров соответствующей nonclient области) —
не покажите ли живое окошко, в котором можно свободно менять NC-метрики, невзирая на системные параметры,
т.е. чтобы с этого
пульта воздействовать на окошко было бы низя ?