title: Can you send a signal to Windows Explorer to make it refresh the systray icons?
body: <p>This problem has been afflicting me for quite a while and it's been really annoying.</p>
  
  <p>Every time I login after a reboot/power cycle the explorer takes some time to show up.
  I've taken the step of waiting for all the services to boot up and then I login, but it doesn't make any difference.
  The result is always the same: Some of the icons do not show up even if the applications have started.</p>
  
  <p>I've dug a bit on the code that makes one application "stick" an icon in there, but is there an API call that one can perform so explorer re-reads all that icon info? Like invalidate or redraw or something of the sort?</p>
  
  <hr>
  
  <p>Apparently, it looks like Jon was right and it's not possible to do it.</p>
  
  <p>I've followed Bob Dizzle and Mark Ransom code and build this (Delphi Code):</p>
  
  <pre><code>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;</code></pre>
  
  <p>But to no avail.</p>
  
  <p>I've even tried with <pre><code>InvalidateRect()</code></pre> and still no show.</p>
  
  <p>Any other suggestions?</p>