在某些情况下程序停止运行后,程序的系统托盘图标仍然存在

时间:2013-08-09 01:09:39

标签: vb.net

我有一个(vb.net)程序,它在启动时会创建一个系统托盘图标。

当它正常退出时,系统会正确删除系统托盘图标。

但是,在某些情况下,例如当程序使用MS任务管理器“结束任务”时,程序的系统托盘图标仍然存在。

这提出了一个非常不幸的错觉,即当程序没有运行时,程序仍在运行。

然而,在这些情况下,一旦用户将鼠标移到程序的系统托盘图标上,程序的系统托盘图标就会消失。

无论如何都要确保在所有情况下都删除系统托盘图标?

1 个答案:

答案 0 :(得分:0)

当你的申请被杀(“结束任务”)时,你没有机会先整理。您的应用程序只是从内存中删除,没有任何警告(或任何方法来阻止它)。这就像在地下突然出现一个洞突然出现在你的脚下 - 你没有机会回家告别你的配偶或重要的其他人。你刚走了。)

对于其他问题(应用程序正确关闭后偶尔出现的“幻影图标”),有一个解决方案。我不确定使用.NET通常如何解决它,但是使用普通的WinAPI编程,当应用程序退出时,您可以使用PostMessage向窗口发送WM_NULL消息,以使系统托盘刷新图标,导致幻像图标消失。

我从来没有在.NET中这样做,但快速检查PInvoke显示这样的事情应该有效(未经测试,但它通过VS Express 2012在VB.NET中编译和执行 - 我显然没有'写一个实际的系统托盘应用程序来测试它是否有效,因为导致“幻影图标”有意出现很难):

Private Declare Function PostMessage _
    Lib "coredll.dll" (ByVal hWnd As IntPtr, _
    ByVal Msg As Integer, _
    ByVal wParam As Integer, _
    ByVal lParam As Integer) As IntPtr

Private Sub Form1_FormClosed(sender As Object, _
                             e As FormClosedEventArgs) _
                             Handles MyBase.FormClosed
    Const WM_NULL As Integer = &H0
    PostMessage(Me.Handle, WM_NULL, 0, 0)
End Sub

请注意,为此目的使用PostMessage而不是SendMessage 非常重要。第一个只是将消息放入消息队列并返回,而第二个等待响应(并且您的应用程序不会在那里发送一个,因为它已经在关闭过程中)。

注意#2:您可能需要在Form1_FormClosing处理程序中执行此操作,而不是FormClosed;正如我所说,我没有一个系统托盘应用程序来测试用于发布消息的正确位置的时间。