3

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

注意 卸载应用程序后,其通知区域图标仍可作为选项显示在控制面板的通知区域图标页面中长达 7 天。但是,在那里所做的任何更改都不会产生任何影响。

是的,当您卸载应用程序时,图标仍然存在于“通知区域图标页面”中,直到您杀死 Explorer.exe 并重新启动它 - 这是我要解决的问题。

您可以通过以下方式进入“通知区域图标页面”(在 Windows 7 中):右键单击任务栏 > 属性 > 自定义

所以我想做的是以编程方式从该列表中删除图标,甚至删除所有图标,然后让 Windows 在您重新打开该列表页面时重新创建它们(这可以通过删除PastIconsStreamand IconStreamsin来完成HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify

但同样,问题是您仅在杀死并重新启动 Explorer.exe才能看到结果- 我假设当您重新启动 explorer.exe 时,它​​会重建列表,但这次使用正确的图标(即不包括已卸载的图标应用)。

所以为了让事情更简单,我会问这个:我如何以编程方式让资源管理器在我删除后刷新“通知区域图标页面列表” PastIconsStream并且IconStreams不杀死/重新启动 explorer.exe 并且不重新启动/注销,这样列表将不包括已卸载的应用程序图标?

4

1 回答 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
于 2016-07-01T09:22:46.163 回答