C# 在Windows 8中刷新开始菜单图标

C# 在Windows 8中刷新开始菜单图标,c#,windows-8,icons,startmenu,C#,Windows 8,Icons,Startmenu,我有一个工作异常的应用程序:安装过程将文件复制到临时文件夹,然后检查一些事情,如果一切正常,将文件移动到最终文件夹 问题是安装程序在移动文件之前创建了快捷方式 结果是,在“开始”菜单(带平铺的菜单)上,图标是“默认排序”图标 我曾尝试使用(广播WM_SETTINGCHANGE消息)强制刷新系统,但在Windows 8的“开始”菜单中似乎不起作用 即使重新启动操作系统似乎也不会刷新图标,唯一有效的方法是将软件重新安装到其上 如何强制刷新Win8开始菜单的图标 首先,谢谢你,你没有告诉我们为什么你

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

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

结果是,在“开始”菜单(带平铺的菜单)上,图标是“默认排序”图标

我曾尝试使用(广播WM_SETTINGCHANGE消息)强制刷新系统,但在Windows 8的“开始”菜单中似乎不起作用

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

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


首先,谢谢你,你没有告诉我们为什么你的安装过程需要这样做。我同意这很奇怪,但我想你有很好的理由这么做。如果没有,我建议从那里开始,修复安装程序,而不是针对个别问题使用创可贴。您以后肯定会遇到其他问题,而且根修复肯定比一堆创可贴更简单、更易于维护

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

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

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

当然,为了调用
SetIconLocation
,您必须获得一个表示实现的快捷方式的对象。这是一个COM接口,我不相信它被.NET框架包装在任何地方。有关从C#创建快捷方式的一般信息,请参见的答案。更具体地说,这里有一个链接,你可以用它来做大部分脏活。我不认为它包含设置/更改图标的方法,但可以简单地添加

或者,您可以使用Windows脚本主机(WSH)包装获得这些相同的属性。它的一个属性的工作方式基本相同,只是它只接受一个字符串参数,索引用逗号从路径中分隔:
myApp.exe,0
。它没有很好的文档记录(我能找到的最好的文档),但是要获得现有的快捷方式,只需使用该方法并指定现有快捷方式的路径即可。例如:

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脚本主机对象模型的引用。为此,右键单击解决方案资源管理器中的“引用”文件夹,单击“COM”选项卡,然后在列表中找到“Windows脚本主机对象模型”


我刚刚测试了这个,它是有效的;效果立竿见影。

感谢您的详尽回答。这是一个遗留的安装脚本,我们既没有预算也没有意愿冒险更改它。如果由我来决定,我早就重写了,但我不被允许。星期一我会试试你的建议,看看效果如何。非常感谢。