奇怪的Windows 7桌面图标缓存

时间:2011-04-13 22:49:03

标签: c# windows windows-7

我正在编写一个C#应用程序来更改桌面上的默认回收站图标。我这样做是通过将图标传输到驱动器上的特定位置并更新注册表以指向新图标。这很有效。

然而,问题是当我卸载应用程序并想要将图标设置为默认值时。当我在Windows中使用内置函数进行测试时,我注意到Windows有时会将注册表更改为%SystemRoot%\System32\imageres.dll,50以获取空图标,将%SystemRoot%\System32\imageres.dll,49更改为完整图标,有时将%SystemRoot%\System32\imageres.dll,-55更改为空图标和{{ 1}}表示完整图标。我似乎无法找到有时使用50和49以及有时候-55 -54作为默认回收站图标的逻辑,也无法找到有关此问题的任何信息。

我也尝试删除User \ username \ AppData \ Local中的图标缓存,但没有任何效果。问题是,当我设置默认图标(使用例如50和49)时,它不会自动更新。我必须每次手动刷新才能更改其状态(空/满)。如果我之后转到Windows中的内置功能并设置默认图标,如果我使用50和49,它将更改为-55或-54然后它可以工作。跆拳道?注册表中必须有其他地方触发这个......你能帮助我吗?

我正在使用的注册表中的位置:

%SystemRoot%\System32\imageres.dll,-54

修改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);

仍然不起作用:(

1 个答案:

答案 0 :(得分:1)

-55是资源 id ,50是资源 id 。资源ID由开发人员设置,索引是从0开始的计数(计数可以在服务包中更改等,但它们通常非常稳定)。您可以使用Resource Hacker之类的工具查看资源ID(在图标组中查找图标ID)

在图标选择器对话框中选择图标时,通常会使用索引。我希望特定的Windows重置按钮能够使用资源ID ...

有关强制执行shell图标刷新的方法,请参阅this answer