我们可以向Windows资源管理器发送信号以使其刷新系统托盘图标吗?
时间:2020-03-05 18:56:36 来源:igfitidea点击:
这个问题困扰了我好一阵子了,这确实很烦人。
重启/重启后,每次登录时,浏览器都会显示一些时间。
我已经采取了等待所有服务启动然后登录的步骤,但这没有任何区别。
结果始终是相同的:即使启动了应用程序,某些图标也不会显示。
我在使一个应用程序"粘贴"在那里的图标的代码上做了一些挖掘,但是是否有一个API调用可以执行,所以资源管理器会重新读取所有这些图标信息?像无效或者重画之类的东西?
显然,乔恩(Jon)看来是正确的,而且不可能做到。
我遵循了Bob Dizzle和Mark Ransom的代码,并构建了以下代码(Delphi代码):
procedure Refresh; var hSysTray: THandle; begin hSysTray := GetSystrayHandle; SendMessage(hSysTray, WM_PAINT, 0, 0); end; function GetSystrayHandle: THandle; var hTray, hNotify, hSysPager: THandle; begin hTray := FindWindow('Shell_TrayWnd', ''); if hTray = 0 then begin Result := hTray; exit; end; hNotify := FindWindowEx(hTray, 0, 'TrayNotifyWnd', ''); if hNotify = 0 then begin Result := hNotify; exit; end; hSyspager := FindWindowEx(hNotify, 0, 'SysPager', ''); if hSyspager = 0 then begin Result := hSyspager; exit; end; Result := FindWindowEx(hSysPager, 0, 'ToolbarWindow32', 'Notification Area'); end;
但无济于事。
我什至尝试过
InvalidateRect()
而且仍然没有显示。
还有其他建议吗?
解决方案
回答
据我所知,Gustavo不可能将每个应用程序的notifyicon放在系统托盘中,并确保其处于正确的状态。
我们有时会注意到,当explorer.exe崩溃时,某些图标没有出现是不是因为它们的进程崩溃了,仅仅是因为当explorer.exe的新实例启动时,其应用程序并未将notifyicon放入系统托盘中。 。再次由应用程序负责。
抱歉没有更好的消息给我们!
回答
在代码中包含以下代码以刷新系统托盘。
public const int WM_PAINT = 0xF; [DllImport("USER32.DLL")] public static extern int SendMessage(IntPtr hwnd, int msg, int character, IntPtr lpsText); Send WM_PAINT Message to paint System Tray which will refresh it. SendMessage(traynotifywnd, WM_PAINT, 0, IntPtr.Zero);
回答
我使用以下C ++代码将窗口句柄获取到托盘窗口。注意:仅在Windows XP上对此进行了测试。
我的解决方案是Delphi ActiveX / COM DLL。下载链接仍然有效(尽管我不知道PLUG成员资格已过期多久了。)
标题数量不匹配
代码数量不匹配