刷新 Windows 8 中的开始菜单图标

Posted

技术标签:

【中文标题】刷新 Windows 8 中的开始菜单图标【英文标题】:Refresh start menu icons in Windows 8 【发布时间】:2013-05-24 15:49:24 【问题描述】:

我有一个运行异常的应用程序:安装过程将文件复制到临时文件夹,然后检查一些东西,如果一切正常,将文件移动到最终文件夹。

问题是安装程序在移动文件之前创建了快捷方式。

结果是在开始菜单(带有磁贴的那个)上,图标是“默认排序”的。

我尝试使用this link(广播 WM_SETTINGCHANGE 消息)强制刷新系统,但它似乎不适用于 Windows 8 开始菜单。

即使重新启动操作系统似乎也不会刷新图标,唯一有效的方法是在其自身之上重新安装软件。

如何强制刷新 Win8 开始菜单的图标?

谢谢

【问题讨论】:

【参考方案1】:

首先,您没有告诉我们为什么您的安装过程需要按照它的方式运行。我同意这很奇怪,但我认为你有充分的理由这样做。如果没有,我建议从那里开始并修复安装程序,而不是在个别问题上使用创可贴。以后你肯定会遇到其他问题,而且根修复肯定比一堆创可贴更简单、更容易维护。

无论如何,如果你必须走这条路……广播WM_SETTINGCHANGE消息不起作用的原因是因为这与图标没有任何关系。这些由资源管理器单独管理,除非您删除其图标缓存,否则不会重建。这自然会促使它重建它。对于最终用户来说,这是一种常见的故障排除技术,但您不想以编程方式执行此操作。谈论一个丑陋的黑客。并改变全局状态以解决局部问题。

此外,如果重新启动操作系统不起作用,您知道这并不像您在问题中所说的那么简单:需要刷新 的属性。在现有安装之上重新安装有效的原因是,在开始创建快捷方式时,其目标可执行文件已经存在于预期的位置(由先前的安装放置在那里)并带有一个有效的图标。

我建议做的是编写一些代码来更改现有快捷方式的图标。确保在将可执行文件复制到其最终目的地之后执行它。允许您这样做的方法是IShellLink::SetIconLocation,它有两个参数:图标的路径(这将是您的可执行文件的路径)和图标的索引(这可能是 0 假设您想要的图标是可执行文件中包含的第一个也是唯一一个)。

当然,为了调用SetIconLocation,您将必须获得一个表示您的快捷方式的对象,该快捷方式实现了IShellLink。这是一个 COM 接口,我认为它不会被 .NET Framework 包装在任何地方。有关从 C# 创建快捷方式的一般信息,请参阅this question 的答案。更具体地说,有一个指向 this wrapper class 的链接,您可以使用它来完成大部分肮脏的工作。我不认为它包含设置/更改图标的方法,但可以轻松添加。

或者,您可以使用 Windows 脚本主机 (WSH) 包装器 WshShortcut 获得这些相同的属性。它有一个IconLocation 属性,除了它只接受一个字符串参数外,它的工作方式几乎相同,索引与路径之间用逗号分隔:myApp.exe, 0。它的文档不是特别好(我能找到的最好的),但要获得现有的快捷方式,您只需使用 CreateShortcut 方法并指定现有快捷方式的路径。例如:

public void SetShortcutIcon(string shortcutPath, string iconPath, int iconIndex)

    // Note: no error checking is performed for the parameters!
    // This is not production-ready code!
    // If a shortcut does not exist at the specified path, you should
    // create a new one instead.
    // If iconPath does not specify a valid executable file, you should
    // set a default icon or perhaps abort.
    IWshRuntimeLibrary.WshShell wsh = new IWshRuntimeLibrary.WshShell();
    IWshRuntimeLibrary.IWshShortcut shortcut = wsh.CreateShortcut(shortcutPath);
    shortcut.IconLocation = String.Format("0, 1", iconPath, iconIndex);
    shortcut.Save();

请注意,为了编译上述代码,您还需要向您的应用程序添加对 Windows 脚本宿主对象模型的引用。为此,请在解决方案资源管理器中右键单击“References”文件夹,单击“COM”选项卡,然后在列表中找到“Windows 脚本宿主对象模型”。

我刚刚对此进行了测试,它可以工作;效果立竿见影。

【讨论】:

感谢您的广泛回答。这是一个遗留的设置脚本,我们没有预算也没有意愿去冒险改变它。如果只由我决定,我早就重写了,但我不被允许。我会在星期一试试你的建议,看看效果如何。谢谢!

以上是关于刷新 Windows 8 中的开始菜单图标的主要内容,如果未能解决你的问题,请参考以下文章

Windows 11 新版 22593 发布:文件资源管理器全新主页,开始菜单图标优化

如何从 NSIS 安装程序“刷新”Windows 7 开始菜单?

开始菜单图标全白了

win10开始菜单程序怎么自定义

从 Windows 开始菜单打开 WPF 应用程序时崩溃

win10怎么把开始菜单中程序图标设置桌面快捷方式