我们可以向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成员资格已过期多久了。)

标题数量不匹配

代码数量不匹配