среда, 3 марта 2010 г.

Использование SystemParametersInfo для получения настроек интерфейса пользователя

Это перевод Using SystemParametersInfo to access user interface settings. Автор: Реймонд Чен.

Функция SystemParametersInfo даёт вам доступ к различным настройкам пользовательского интерфейса, и это единственный поддерживаемый официально способ получить эти настройки.

Я не буду рассматривать каждую опцию; идите и прочитайте сами. Вот несколько примеров:
  • SPI_GETICONTITLELOGFONT позволяет вам узнать шрифт, который используется для подписей к иконкам; SPI_SETICONTITLELOGFONT позволяет вам установить его.
  • SPI_GETNONCLIENTMETRICS позволяет вам запросить шрифты, которые используются в заголовках окон, меню, строках статуса и сообщениях; SPI_SETNONCLIENTMETRICS позволяет вам сменить их.
А вот некоторые настройки из Панели управления:
  • SPI_SETKEYBOARDDELAY и SPI_SETKEYBOARDSPEED позволяют вам сменить настройки авто-повтора клавиш клавиатуры.
  • SPI_SETDOUBLECLICKTIME позволяет вам сменить скорость двойного щелчка.
  • SPI_SETMENUFADE позволяет вам включить или отключить анимацию выпадения меню.
  • Есть целая серия настроек SPI_SETxxxANIMATION, которые позволяют вам контролировать анимацию различных элементов экрана.
Заметьте, что когда вы используете команды SPI_SET*, вы также должны выбрать, будут ли эти изменения временными (сбросятся после выхода пользователя из системы) или же постоянными. Исторически названный флаг SPIF_UPDATEINIFILE приводит к сохранению настроек в пользовательский профиль; если же вы не указываете его, то изменения в профиль не сохраняются и теряются при logoff-е. Вы должны также устанавливать флаг SPIF_SENDCHANGE, чтобы программы, которые хотят обновить себя при изменениях настроек, смогли бы это сделать.

Тот факт, что у нас существуют как временные, так и постоянные установки, указывает на опасности прямого чтения настроек из реестра. Если текущие настройки являются временными, то они не сохраняются в профиль пользователя (реестр). Функция SystemParametersInfo получает текущие установки, даже если они временные. Например, если вы хотите узнать, анимированы ли меню, а пользователь временно отключил анимацию, то чтение реестра скажет вам, что они являются анимированными, когда в действительности они не анимированы.

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

Это по-прежнему удивляет меня: почему люди используют недокументированные ключи реестра, когда есть отличный документированный способ для этого. Особенно, когда документированный способ действительно работает, а недокументированный способ - не всегда.

Я помню одно приложение, которое шло напрямую в реестр за недокументированным ключом реестра (я думаю, для получения шрифта заголовка иконки). К несчастью для этого приложения, формат ключа реестра был изменён между Windows 95 и Windows 2000, так что приложение стало вылетать (оно ожидало формат Windows 95). Если бы оно использовало документированный способ получения шрифта, то оно бы продолжило работать, и ему было бы плевать на внутренние изменения реестра. Другими словами, эта программа обошла предпочтительный способ делать вещи, только для того, чтобы загнать саму себя в ловушку.

2 комментария:

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.