如何以编程方式刷新“通知区域图标”页面

时间:2012-05-03 01:00:22

标签: c++ vb.net windows-7 windows-explorer

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

  

注意当卸载某个应用程序时,其通知区域图标仍可在控制面板的“通知区域图标”页面中作为选项显示给用户最多七天。但是,任何更改都不会产生任何影响。

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

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

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

但同样,问题是你只看到之后你杀了并重新启动Explorer.exe - 我假设当你重新启动explorer.exe时它会重建列表,但这一次是正确的图标(即不包括已卸载应用程序中的图标)。

所以为了简单起见,我会问这个问题: 在删除PastIconsStreamIconStreams而不删除/重新启动explorer.exe并且不重新启动/注销以使该列表不包含已卸载的应用程序图标后,如何以编程方式使资源管理器刷新“通知区图标页面列表” ?

1 个答案:

答案 0 :(得分:0)

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

为此,您需要:

  • 更改注册表中的Shell Icon Size参数
  • 发送HWND_BROADCAST以通知用户设置已更改
  • 恢复默认的Shell Icon Size值(否则整个Windows用户界面将被搞砸)
  • 重新发送广播消息

这是一个用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