Странный кеш иконок рабочего стола Windows 7 - PullRequest
4 голосов
/ 14 апреля 2011

Я пишу приложение на C #, которое меняет значок корзины по умолчанию на рабочем столе. Я делаю это путем переноса значков в определенное место на диске и обновления реестра, чтобы они указывали на новые значки. Это работает довольно хорошо.

Однако проблема заключается в том, что я удаляю приложение и хочу вернуть значки по умолчанию. Когда я тестирую встроенную функцию в Windows, я замечаю, что Windows иногда меняет реестр на %SystemRoot%\System32\imageres.dll,50 для пустого значка и %SystemRoot%\System32\imageres.dll,49 для полного значка И иногда %SystemRoot%\System32\imageres.dll,-55 для пустого значка и %SystemRoot%\System32\imageres.dll,-54 для полного значка. Я действительно не могу найти логику в том, чтобы иногда использовать 50 и 49, а иногда -55 -54 для значка корзины по умолчанию, и при этом я не могу найти какую-либо информацию относительно этой проблемы.

Я также попытался удалить кэш иконок в папке User \ username \ AppData \ Local без какого-либо эффекта. Проблема в том, что когда я устанавливаю обратно значки по умолчанию (с использованием, например, 50 и 49), они не обновляются автоматически Мне приходится каждый раз вручную обновлять, чтобы изменить его состояние (пусто / заполнено). Если впоследствии я перейду к встроенной функции в Windows и верну значки по умолчанию, она изменится на -55 или -54, если я использовал 50 и 49, и тогда она будет работать. WTF? Там должно быть где-то еще в реестре, который вызывает это .. вы можете мне помочь?

Место в реестре, с которым я работаю:

HKEY_CURRENT_USER\
Software\
Microsoft\
Windows\
CurrentVersion\
Explorer\
CLSID\
{645FF040-5081-101B-9F08-00AA002F954E}\
DefaultIcon

Редактировать 18/04-2011 После публикации Андерса я придумаю следующее:

[System.Runtime.InteropServices.DllImport("User32.dll")]
public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
[System.Runtime.InteropServices.DllImport("User32.dll")]
public static extern long SendMessageTimeout(int hWnd, int Msg, int wParam, int lParam, int fuFlags, int uTimeout, out int lpdwResult);

private const int SPI_SETICONS = 0x0058;
private const int SPIF_UPDATEINIFILE = 0x1;
private const int SPIF_SENDWININICHANGE = 0x2;
private const int HWND_BROADCAST = 0xffff;
private const int WM_SETTINGCHANGE = 0x001A;
private const int SMTO_ABORTIFHUNG = 0x0002;
private const int SPI_SETNONCLIENTMETRICS = 0x0002;

        int res = 0;
        RegistryKey iconSizeKey = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop\\WindowMetrics", true);
        int iconSize = Int16.Parse((string)iconSizeKey.GetValue("Shell Icon Size"));
        int newIconSize = iconSize - 1;
        iconSizeKey.SetValue("Shell Icon Size", newIconSize, RegistryValueKind.String);
        SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, out res);
        iconSizeKey.SetValue("Shell Icon Size", iconSize, RegistryValueKind.String);
        SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, out res);

Но это ничего не меняет: (

Редактировать 19/02-2011 После публикации Андерса я обновил это:

[System.Runtime.InteropServices.DllImport("Shell32.dll")]
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);

И перепробовал все эти комбинации:

    SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
    SHChangeNotify(0x08000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
    SHChangeNotify(0x00008000, 0x1000, IntPtr.Zero, IntPtr.Zero);
    SHChangeNotify(0x00002000, 0x1000, IntPtr.Zero, IntPtr.Zero);

Все еще не работает: (

1 Ответ

1 голос
/ 14 апреля 2011

-55 - это ресурс id , 50 - это ресурс index . Идентификатор ресурса устанавливается разработчиком, индекс представляет собой счетчик, начинающийся с 0 (счетчик может измениться в пакете обновления и т. Д., Но они обычно довольно стабильны). Вы можете просматривать идентификаторы ресурсов с помощью инструмента, подобного Resource Hacker (в Icon Group для просмотра идентификаторов значков)

Когда вы выбираете значок в диалоговом окне выбора значков, индекс обычно используется. Я ожидаю, что определенная кнопка сброса Windows будет использовать идентификатор ресурса ...

См. этот ответ , чтобы узнать, как принудительно обновить значок оболочки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...