我可以重新获得丢失的正在运行的应用程序的系统托盘图标吗?

时间:2009-07-11 23:08:01

标签: delphi refresh icons systray

因为我终于得到了这个问题的答案:Can you send a signal to windows explorer to make it refresh the systray icons,要求摆脱死亡系统图标,我想问相反。

有没有办法“轻推”一个应用程序,如果它丢失了,就会重新显示它的systray图标?

自从我安装Avira AV以来,它就发生在我的Apache Monitor上 好的,被授予,它只能是副作用,但让运行的应用程序被杀死然后重新启动它是非常烦人的,因为它没有正确显示系统托盘图标。

提前致谢,
格斯

3 个答案:

答案 0 :(得分:10)

恢复任务栏图标是由应用程序本身(而不是资源管理器)实现的。有一个窗口消息称为“TaskbarCreated”(其值可以通过RegisterWindowMessage("TaskbarCreated")获得)应用程序需要响应,以便在必要时恢复任务栏图标。

例如,应用程序可以执行此操作:

const int uTaskbarCreatedMsg = RegisterWindowMessage("TaskbarCreated");

然后在其WndProc函数中:

LRESULT CALLBACK WndProc(HWND w, UINT msg, WPARAM wparam, LPARAM lparam)
{
    // ... handle other messages
    if (msg == uTaskbarCreatedMsg) {
        NOTIFYICONDATA nid;
        // fill in details to create icon
        Shell_NotifyIcon(NIM_ADD, &nid);
        return 0;
    }
    // ... default message handling
}

因此,为了强制应用程序恢复其任务栏图标,您需要将相同的TaskbarCreated消息发送到应用程序中的相应窗口。获取HWND窗口的一种方法是使用FindMessage(由于Apache Monitor是开源的,因此很容易找到要查找的窗口)。

答案 1 :(得分:4)

我编写了一个项目,将TaskbarCreated消息发送到系统中的所有顶级窗口。如果他们已经注册了一个托盘图标,那么应该让他们在资源管理器崩溃后恢复图标。

我在MIT许可下发布了the source,并在自述文件中提供了the compiled console application(与Lazarus)的链接。

当然可以进行一些改进,例如,如果已知图标已经在托盘中,则不发送消息,但是现在这个应用程序导致我知道在Explorer崩溃时丢失的图标重新出现

答案 2 :(得分:-3)

这对我有用(Windows 7 - 64位)

  1. 启动taskmanager
  2. 杀死apachemonitor进程
  3. 从“开始”菜单启动apachemonitor
  4. 您现在应该在系统托盘中看到图标