奇怪的Windows 7桌面图标缓存

本文关键字:桌面 图标 缓存 Windows | 更新日期: 2023-09-27 17:49:59

我正在写一个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作为默认回收站图标,我似乎真的找不到逻辑,也找不到任何有关此问题的信息。

我也试过删除用户'username'AppData'Local中的图标缓存,没有任何效果。问题是,当我设置回默认图标(使用例如50和49),它不会自动更新。我必须每次手动刷新,以改变其状态(空/满)。如果我后来进入Windows的内置功能并设置默认图标,如果我使用50和49,它会变为-55或-54,然后它就可以工作了。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);

仍然不工作:(

奇怪的Windows 7桌面图标缓存

-55为资源id, 50为资源索引。资源id由开发人员设置,索引是一个从0开始的计数(计数可以在服务包中更改,但它们通常相当稳定)。你可以使用像resource Hacker这样的工具查看资源id(查看图标组中的图标id)

在图标选择器对话框中选择图标时,通常使用索引。我希望一个特定的窗口重置按钮使用资源id…