背景: 如果你看这里: 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时它会重建列表,但这一次是正确的图标(即不包括已卸载应用程序中的图标)。
所以为了简单起见,我会问这个问题:
在删除PastIconsStream
和IconStreams
而不删除/重新启动explorer.exe并且不重新启动/注销以使该列表不包含已卸载的应用程序图标后,如何以编程方式使资源管理器刷新“通知区图标页面列表” ?
答案 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