刷新 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 发布:文件资源管理器全新主页,开始菜单图标优化