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

时间:2013-05-24 15:49:24

标签: c# windows-8 icons startmenu

我有一个奇怪的应用程序:安装过程将文件复制到临时文件夹,然后检查一些内容,如果一切正常,则将文件移动到最终文件夹。

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

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

In the start menu

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

即使重新启动操作系统似乎也没有刷新图标,唯一有效的方法是重新安装软件。

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

由于

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

我刚试过这个并且它有效;效果是即时的。