Я пишу приложение на 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);
Все еще не работает: (