如何通过编程刷新通知区域图标页面

3
背景: 如果您在这里查看: http://msdn.microsoft.com/en-us/library/ee330740%28v=vs.85%29.aspx 在底部您会看到:

注意:当应用程序被卸载时,它的通知区域图标仍然可以作为“控制面板”中“通知区域图标”页面中的选项显示给用户长达七天。但是,在那里进行的任何更改都不会产生影响。

是的,当您卸载应用程序时,该图标仍会出现在“通知区域图标”页面上,直到您终止Explorer.exe并重新启动它-这就是我要解决的问题。
您可以通过以下方式(在Windows 7中)进入“通知区域图标”页面:右键单击任务栏>属性>自定义
因此,我想要做的是以编程方式从该列表中删除图标,甚至删除所有图标,然后让Windows在重新打开该列表页时重新创建它们(这可以通过删除HKEY_CURRENT_USER \ Software \ Classes \ Local Settings \ Software \ Microsoft \ Windows \ CurrentVersion下的PastIconsStream和IconStreams来完成\ TrayNotify))
但是,问题在于只有在您终止并重新启动Explorer.exe之后才能看到结果-我假设当您重新启动explorer.exe时,它会重建列表,但这次使用正确的图标(即不包括已卸载应用程序的图标)。
因此,为了简化事情,我将问这个问题: 在我删除PastIconsStream和IconStreams之后,如何以编程方式使资源管理器刷新“通知区域图标页面列表”,而无需终止/重新启动explorer.exe并且不需要重新启动/注销,以便该列表不包括已卸载应用程序的图标?

2
没有支持的方法来完成这个。 - Raymond Chen
2
有没有不受支持的方法来做到这一点? - user1359858
我的软件清理无用的注册表、临时文件等,我希望它也能删除通知区域中不必要的图标,但我不想通过终止资源管理器来实现。 - user1359858
1个回答

0

强制 Windows 重建其内部图标缓存应该可以解决问题。

为此,您需要:

  • 更改注册表中的 Shell Icon Size 参数
  • 发送一个 HWND_BROADCAST 通知 UI 设置已更改
  • 恢复默认的 Shell Icon Size 值(否则整个 Windows UI 将被搞乱)
  • 再次发送广播消息

这是一个演示代码(不幸的是)用 VB6 编写的(而不是 VB.NET):

Private Sub RebuildIconCache()

    Dim IconSize As Integer
    Dim r As Long

    IconSize = QueryValue(HKEY_CURRENT_USER, "Control Panel\Desktop\WindowMetrics", "Shell Icon Size")
    SetKeyValue HKEY_CURRENT_USER, "Control Panel\Desktop\WindowMetrics", "Shell Icon Size", CStr(IconSize - 1)

    SendMessageTimeout HWND_BROADCAST, _
                        WM_SETTINGCHANGE, _
                        SPI_SETNONCLIENTMETRICS, _
                        0&, SMTO_ABORTIFHUNG, _
                        10000&, r

    DoEvents

    If IconSize < 32 Then IconSize = 32
    SetKeyValue HKEY_CURRENT_USER, "Control Panel\Desktop\WindowMetrics", "Shell Icon Size", CStr(IconSize)

    SendMessageTimeout HWND_BROADCAST, _
                        WM_SETTINGCHANGE, _
                        SPI_SETNONCLIENTMETRICS, _
                        0&, SMTO_ABORTIFHUNG, _
                        10000&, r

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接