gpt4 book ai didi

c# - 奇怪的 Windows 7 桌面图标缓存

转载 作者:可可西里 更新时间:2023-11-01 14:28:19 26 4
gpt4 key购买 nike

我正在编写一个 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 然后它可以工作。卧槽?注册表中一定有其他地方触发了这个。你能帮我吗?

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

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

编辑 18/04-2011 在 Anders 的帖子之后我想出了这个:

[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 在 Anders 的帖子之后我更新了这个:

[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);

还是不行:(

最佳答案

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

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

参见 this answer强制刷新 shell 图标的方法

关于c# - 奇怪的 Windows 7 桌面图标缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com