当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《您可以向Windows资源管理器发送信号以刷新系统托盘图标吗?》经验,为你挑选了2个好方法。

这个问题困扰了我很长一段时间,这真的很烦人.

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

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


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

我遵循了Bob Dizzle和Mark Ransom代码并构建了这个(Delphi 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;

但无济于事.

我甚至尝试过

InvalidateRect()
仍然没有显示.

还有其他建议吗?



1> Louis Davis..:

看一下这篇博客文章:刷新TASKBAR通知区域.我正在使用此代码刷新系统托盘以摆脱孤立的图标,它的工作完美.博客文章内容非常丰富,并对作者发现他的解决方案所采取的步骤进行了很好的解释.

#define FW(x,y) FindWindowEx(x, NULL, y, L"")

void RefreshTaskbarNotificationArea()
{
    HWND hNotificationArea;
    RECT r;

    GetClientRect(
        hNotificationArea = FindWindowEx(
            FW(FW(FW(NULL, L"Shell_TrayWnd"), L"TrayNotifyWnd"), L"SysPager"),
            NULL,
            L"ToolbarWindow32",
            // L"Notification Area"), // Windows XP
            L"User Promoted Notification Area"), // Windows 7 and up
        &r);

    for (LONG x = 0; x < r.right; x += 5)
        for (LONG y = 0; y < r.bottom; y += 5)
            SendMessage(
                hNotificationArea,
                WM_MOUSEMOVE,
                0,
                (y << 16) + x);
}


我怀疑最后一个参数"通知区域"是否适用于Windows的国际版本.
dummzeuch是对的."通知区域"字符串需要针对相应的Windows语言进行本地化.

2> Stephen Klan..:

在Windows 7或Windows 8上使用路易斯答案(来自刷新TASKBAR通知区域)的任何人的两个重要细节:

首先,正如答案所反映的那样,XP中标题为"通知区域"的窗口现在在Windows 7(实际上可能是Vista)中标题为"用户升级通知区域".

其次,此代码不会清除当前隐藏的图标.这些包含在一个单独的窗口中.使用原始代码刷新可见图标,使用以下内容刷新隐藏图标.

//Hidden icons
GetClientRect(
    hNotificationArea = FindWindowEx(
        FW(NULL, L"NotifyIconOverflowWindow"),
        NULL,
        L"ToolbarWindow32",
        L"Overflow Notification Area"),
    &r);

for (LONG x = 0; x < r.right; x += 5)
    for (LONG y = 0; y < r.bottom; y += 5)
        SendMessage(
            hNotificationArea,
            WM_MOUSEMOVE,
            0,
            (y << 16) + x);

对于只需要一个实用程序来运行来完成此任务而不是代码的任何人,我使用此更新构建了一个简单的exe:刷新通知区域

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有