Сделать кеш обновления иконок Windows

Мне очень понравился внешний вид кислорода в KDE SC 4. Я написал программу для применения этих значков к окнам. Программа написана на NSIS и в настоящее время практически полностью функционирует. Тем не менее, единственный способ сообщить Windows об изменениях значков - это убить explorer.exe, удалить кэш значков и респаун explorer.exe. SHChangeNotify с SHCNE_ASSOCCHANGED Похоже, что Windows не может сообщить об изменениях значка панели управления, значка "Мой компьютер" и т. д. Пожалуйста, предложите лучший, менее жестокий подход, чтобы Windows узнала об этих изменениях.

РЕДАКТИРОВАТЬ: Я нашел программу под названием Icon Tweaker, которая, кажется, в состоянии сделать это, но это с закрытым исходным кодом, и поэтому я понятия не имею, как это делает. (IconTweaker: http://www.crystalxp.net/galerie/en.id.83-icontweaker.html)

РЕДАКТИРОВАТЬ: у меня это работает нормально, благодаря ответу Андерса (см. Ниже). Тем не менее, я просто помещу свой рабочий код NSIS здесь, на случай, если это понадобится кому-то

ReadRegStr $0 HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size"
IntOp $0 $0 + 1
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000
IntOp $0 $0 - 1
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000

Регистр $0 используется для хранения Shell Icon Size ценность HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics, Затем мы увеличиваем значение и делаем SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL)с последующим уменьшением и повторной отправкой.

РЕДАКТИРОВАТЬ: В качестве бонуса, это может быть использовано как взломать, чтобы получить большие (размер Windows 7) значки рабочего стола на Windows XP. Просто удвойте Shell Icon Size ценность и вызов SendMessage (не выполняйте второе изменение, которое восстанавливает размер)

3 ответа

Решение

SystemParametersInfo() имеет параметр SPI_SETICONS, который "перезагружает системные значки" в соответствии с MSDN. Я никогда не пытался использовать SPI_SETICONS, поэтому я не знаю, работает ли он, если вы хотите протестировать, вы бы использовали что-то вроде

System::Call 'user32::SystemParametersInfo(i 0x0058,i0,i0,i2)i' ;SPI_SETICONS

Если окажется, что этого недостаточно, вы можете достать большой недокументированный молоток:

  1. Считайте значение REG_SZ с именем "Размер значка оболочки" в HKEY_CURRENT_USER\ Панель управления \ Рабочий стол \WindowMetrics (Если значение отсутствует, прервите или используйте GetSystemMetrics(SM_CXICON))
  2. Вычтите 1 из числа, полученного на первом этапе
  3. Запишите измененную запись обратно в реестр
  4. Вызов SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL)
  5. Запишите номер, полученный с первого шага, обратно в реестр
  6. Вызов SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL)

Обратите внимание, что это может привести к переупорядочению значков на рабочем столе, даже если отключено "Автоматическое расположение", и, возможно, другие вещи, которые могут раздражать пользователя!

Вы можете просто запустить следующую командную строку:

c:\Windows\System32\ie4uinit.exe -ClearIconCache

Эта командная строка удалит ваши значки кэша без необходимости перезапускать проводник

Простой способ обновить значки — использовать очистку диска Windows . Я бы посоветовал большинству пользователей начать с этого метода — он быстрый, простой и не страшный для новичков.

  • Щелкните меню «Пуск» и введите ОЧИСТКА ДИСКА.
  • Выберите диск, который вы хотите очистить (скорее всего, диск C: по умолчанию )
  • Проверьте миниатюры в списке «Файлы для удаления».
  • Нажмите ОК

Как только Windows завершит удаление кэшированных эскизов, она просто восстановит их при повторном посещении папки. Этот процесс быстрый, и при этом нет никакого вреда для вашей системы.

Надеюсь это поможет!

Другие вопросы по тегам