我可以重新获得一个正在运行的应用程序,不见了的系统托盘图标?(Can I re-gain a sys

2019-07-30 02:20发布

因为我终于得到这个问题的答案: 你可将信号发送到Windows资源管理器,使其刷新系统托盘图标 ,询问有关摆脱死系统托盘图标,我想问的是相反的。

有没有一种方法来“微调”的应用程序,如果它已经丧失重新显示它的系统托盘图标?

它发生在我的Apache监视器自从我安装的Avira AV。
好了,理所当然的,它只能是一种副作用,但它是很烦人有正在运行的应用程序杀死了,然后重新启动它,只是因为它无法正确显示系统托盘图标。

提前致谢,
格斯

Answer 1:

我已经写了发送TaskbarCreated消息系统中所有顶层窗口的项目。 如果他们已经注册了一个托盘图标,这应该使他们恢复图标资源管理器崩溃之后。

我已经发布源在MIT许可下,并提供了一个链接, 编译控制台应用程序中的自述文件(与拉撒路)。

当然,还有可能进行,就像如果图标被称为是在盘已经不发送的消息数的改进,但现在这个应用会,我知道去的资源管理器崩溃重现丢失的图标。



Answer 2:

恢复任务栏图标的东西是由应用程序本身(而不是资源管理器)来实现。 有所谓的“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的监控是开源的,可以很容易地发现找哪个窗口)。



Answer 3:

这个工作对我(的Windows 7 - 64位)

  1. 启动任务管理器
  2. 杀apachemonitor过程
  3. 从开始菜单中启动apachemonitor

您现在应该看到在系统托盘的图标



文章来源: Can I re-gain a systray icon of a running app that has gone missing?