因为我终于得到了这个问题的答案:你能向 Windows 资源管理器发送一个信号,让它刷新系统托盘图标,询问如何摆脱死掉的系统托盘图标,我想问相反的问题。
如果应用程序丢失,有没有办法“轻推”应用程序以重新显示它的系统托盘图标?
自从我安装 Avira AV 以来,它就发生在我的 Apache Monitor 上。
好吧,当然,这可能只是一个副作用,但是让正在运行的应用程序杀死然后重新启动它是很烦人的,只是因为它没有正确显示系统托盘图标。
在此先感谢,
格斯
因为我终于得到了这个问题的答案:你能向 Windows 资源管理器发送一个信号,让它刷新系统托盘图标,询问如何摆脱死掉的系统托盘图标,我想问相反的问题。
如果应用程序丢失,有没有办法“轻推”应用程序以重新显示它的系统托盘图标?
自从我安装 Avira AV 以来,它就发生在我的 Apache Monitor 上。
好吧,当然,这可能只是一个副作用,但是让正在运行的应用程序杀死然后重新启动它是很烦人的,只是因为它没有正确显示系统托盘图标。
在此先感谢,
格斯
恢复任务栏图标是由应用程序本身(而不是资源管理器)实现的。应用程序需要响应一个名为“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 是开源的,因此很容易发现要查找的窗口)。
我编写了一个项目,该项目将 TaskbarCreated 消息发送到系统中的所有顶级窗口。如果他们注册了托盘图标,那应该会导致他们在资源管理器崩溃后恢复图标。
我已经在 MIT 许可下发布了源代码,并在自述文件中提供了指向已编译控制台应用程序(使用 Lazarus)的链接。
当然可以进行一些改进,例如如果已知图标已经在托盘中,则不发送消息,但现在这个应用程序会导致我知道在资源管理器崩溃时丢失的图标重新出现。
这对我有用(Windows 7 - 64 位)
您现在应该在系统托盘中看到该图标