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

Gus*_*eno 4 delphi icons refresh systray

因为我终于得到了这个问题的答案:你可以向Windows资源管理器发送一个信号,让它刷新系统图标,询问有关摆脱死亡系统图标的问题,我想问相反的问题.

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

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

提前谢谢,
Gus

Gre*_*ill 10

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

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

const int uTaskbarCreatedMsg = RegisterWindowMessage("TaskbarCreated");
Run Code Online (Sandbox Code Playgroud)

然后在它的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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 发送该应用程序的TaskbarCreated消息可能只是诀窍.否则,如果Apache Monitor应用程序不支持该消息,那么由于它是开源的,您可以使用上面的代码添加该功能. (3认同)

rin*_*ter 4

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

我已经根据 MIT 许可证发布了源代码,并在自述文件中提供了已编译的控制台应用程序(使用 Lazarus)的链接。

当然可以进行一些改进,例如,如果已知图标已位于托盘中,则不发送消息,但目前此应用程序会导致我知道在资源管理器崩溃时丢失的图标重新出现。