Установка шрифта меню и заголовка окна: возможно ли это...
От: remark Россия http://www.1024cores.net/
Дата: 12.02.05 11:40
Оценка:
Задача: необходимо установить шрифт для меню, заголовка окна, статусбара и т.д. только для одной программы.
Данный вопрос уже поднимался на форуме, но лучшее, решение, которое я видел, — рисовать окно самому — это, конечно, гемор. К тому же сложно сопровождать и поддерживать для различных версий ОС... Хотелось бы более универсальное решение.

У меня возникла следующая идея. Приложение откуда-то эти данные (шрифты) получает. Следовательно можно перехватывать некие вызовы API, с помощью которых программа получает описания шрифтов, и возвращать ему необходимый шрифт. По идее, это всё, что нужно — другие программы по прежнему будут рисовать шрифтами, установленными в системе, а моя программа будет рисовать моим шрифтом.

Но на практике возникли проблемы. Пытаюсь перехватывать вызовы SystemParametersInfoA/W(SPI_GETNONCLIENTMETRICS, ...) и RegQueryValueExA/W() к ветке "HCU\Control Panel\Desktop\WindowMetrics" (методом научного тыка вроде это там лежит). Для начала попытался подменить шрифт для всех процессов — ставлю глобальный хук и ставлю в начале функции jmp на мою, т.е. все вызовы к этим функциям должны перехватываться... далее рассылаю всем приложениям WM_SETTINGCHANGE, что бы они обновили настройки.
В результате, у части приложений шрифт установился мой, у части — нет. Например, Explorer главное меню рисует моим шрифтом, выпадающее меню Favorites — моим, а все остальные выпадающие меню системным... В программе, в которой собственно это и надо сделать (стандартное MFC приложение) вообще мой шрифт не устанавливается.


Хотелось бы услышать все мнения и предложения на этот счёт: как ещё приложения могут получать эту информацию, может перехватывать надо как-то не так, кто и как рисует главное меню, почему часть меню в Explorer изменилась, а часть нет...

Я думаю решение данной проблемы будет интересно многим, хотя бы с точки зрения получения опыта.

Заранее спасибо всем откликнувшимся, remark

1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.