Сделать кеш обновления иконок 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
Если окажется, что этого недостаточно, вы можете достать большой недокументированный молоток:
- Считайте значение REG_SZ с именем "Размер значка оболочки" в HKEY_CURRENT_USER\ Панель управления \ Рабочий стол \WindowMetrics (Если значение отсутствует, прервите или используйте GetSystemMetrics(SM_CXICON))
- Вычтите 1 из числа, полученного на первом этапе
- Запишите измененную запись обратно в реестр
- Вызов SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL)
- Запишите номер, полученный с первого шага, обратно в реестр
- Вызов SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL)
Обратите внимание, что это может привести к переупорядочению значков на рабочем столе, даже если отключено "Автоматическое расположение", и, возможно, другие вещи, которые могут раздражать пользователя!
Вы можете просто запустить следующую командную строку:
c:\Windows\System32\ie4uinit.exe -ClearIconCache
Эта командная строка удалит ваши значки кэша без необходимости перезапускать проводник
Простой способ обновить значки — использовать очистку диска Windows . Я бы посоветовал большинству пользователей начать с этого метода — он быстрый, простой и не страшный для новичков.
- Щелкните меню «Пуск» и введите ОЧИСТКА ДИСКА.
- Выберите диск, который вы хотите очистить (скорее всего, диск C: по умолчанию )
- Проверьте миниатюры в списке «Файлы для удаления».
- Нажмите ОК
Как только Windows завершит удаление кэшированных эскизов, она просто восстановит их при повторном посещении папки. Этот процесс быстрый, и при этом нет никакого вреда для вашей системы.
Надеюсь это поможет!