您可以向Windows资源管理器发送信号以刷新系统托盘图标吗?

前端之家收集整理的这篇文章主要介绍了您可以向Windows资源管理器发送信号以刷新系统托盘图标吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题困扰了我很长一段时间,这真的很烦人.

每次我在重新启动/重启后登录时,资源管理器都会花费一些时间来显示.
我已经采取了等待所有服务启动然后我登录的步骤,但它没有任何区别.
结果始终相同:即使应用程序已启动,某些图标也不会显示.

我已经挖了一些代码,让一个应用程序“粘贴”在那里的一个图标,但是有一个API调用可以执行,所以资源管理器重新读取所有图标信息?像无效或重绘或类似的东西?

显然,看起来乔恩是对的,这是不可能做到的.

我遵循了Bob Dizzle和Mark Ransom代码并构建了这个(Delphi Code):

  1. procedure Refresh;
  2. var
  3. hSysTray: THandle;
  4. begin
  5. hSysTray := GetSystrayHandle;
  6. SendMessage(hSysTray,WM_PAINT,0);
  7. end;
  8.  
  9. function GetSystrayHandle: THandle;
  10. var
  11. hTray,hNotify,hSysPager: THandle;
  12. begin
  13. hTray := FindWindow('Shell_TrayWnd','');
  14. if hTray = 0 then
  15. begin
  16. Result := hTray;
  17. exit;
  18. end;
  19.  
  20. hNotify := FindWindowEx(hTray,'TrayNotifyWnd','');
  21. if hNotify = 0 then
  22. begin
  23. Result := hNotify;
  24. exit;
  25. end;
  26.  
  27. hSyspager := FindWindowEx(hNotify,'SysPager','');
  28. if hSyspager = 0 then
  29. begin
  30. Result := hSyspager;
  31. exit;
  32. end;
  33.  
  34. Result := FindWindowEx(hSysPager,'ToolbarWindow32','Notification Area');
  35. end;

但无济于事.

我甚至尝试过

  1. InvalidateRect()

仍然没有表现.

还有其他建议吗?

看一下这篇博客文章REFRESHING THE TASKBAR NOTIFICATION AREA.我正在使用此代码刷新系统托盘以摆脱孤立的图标,它完美无缺.
博客文章内容丰富,并对作者发现其解决方案所采取的步骤进行了很好的解释.
  1. #define FW(x,y) FindWindowEx(x,NULL,y,L"")
  2.  
  3. void RefreshTaskbarNotificationArea()
  4. {
  5. HWND hNotificationArea;
  6. RECT r;
  7.  
  8. GetClientRect(
  9. hNotificationArea = FindWindowEx(
  10. FW(FW(FW(NULL,L"Shell_TrayWnd"),L"TrayNotifyWnd"),L"SysPager"),L"ToolbarWindow32",// L"Notification Area"),// Windows XP
  11. L"User Promoted Notification Area"),// Windows 7 and up
  12. &r);
  13.  
  14. for (LONG x = 0; x < r.right; x += 5)
  15. for (LONG y = 0; y < r.bottom; y += 5)
  16. SendMessage(
  17. hNotificationArea,WM_MOUSEMOVE,(y << 16) + x);
  18. }

猜你在找的Windows相关文章