Сделать кеш обновления иконок Windows - PullRequest
5 голосов
/ 14 июля 2010

Мне очень понравился кислородный вид 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 (не выполняйте второе изменение, которое восстанавливает размер)

Ответы [ 2 ]

5 голосов
/ 18 декабря 2013

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

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

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

5 голосов
/ 14 июля 2010

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_ABIFIF, 0, SMTOGABORTNULL)
  5. Запишите число, полученное в результате первого шага, обратно в реестр
  6. Call SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, * 1020) NULL)

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

...