【问题标题】:Why is my notifyicon application not exiting when I use Application.Exit() or Form.Close()?当我使用 Application.Exit() 或 Form.Close() 时,为什么我的 notifyicon 应用程序没有退出?
【发布时间】:2010-08-26 09:58:16
【问题描述】:

我有一个退出到系统托盘 Notifyicon 的 Windows 窗体应用程序,我尝试调用 Application.Exit() 或 Me.Close() 来关闭程序。但两者都无法关闭程序。关闭它的正确方法是什么?

【问题讨论】:

    标签: winforms


    【解决方案1】:

    ' 最好在结束应用程序之前让系统托盘图标不可见,否则,当应用程序不再运行时,它可能会在托盘中逗留。

    该位指的是通知区域(系统托盘)并没有真正轮询以确保与图标对应的句柄仍然存在。因此,如果某些东西没有正常退出或者没有清理它的通知图标,那么通知区域就不会意识到那个窗口句柄飞了鸡舍。

    您之前可能已经看到过这种行为:有时您将鼠标悬停在通知区域上,一旦鼠标开始悬停在某个应用程序的图标上,您知道您已经退出了一段时间,通知区域就会显示“好吧,关闭我的嘴巴把我涂成红色,猜猜那个把手已经不在了”然后噗!删除图标。

    但我关闭程序后,托盘图标仍然显示,所有功能都可用。在我看来,程序仍在运行。

    是的,在我看来,您的应用程序仍在运行。请注意,Application.Exit() 不必成功 - 存在允许应用程序的其他部分取消请求的重载。所以这是需要检查的。

    通知图标并不能真正让您的应用保持“活跃”,因为它没有消息泵在您的控制之下,就像以前一样。您的应用中的某些内容未退出。

    希望能帮助您走上正轨!

    【讨论】:

    • 嗨,伙计,我现在意识到出了什么问题。我这样实现“退出到系统托盘”:在formclosure事件处理程序中,设置e.Cancel=true,隐藏winform并显示notifyicon。由于我取消了表单关闭,未来的表单关闭也将被取消,这就是问题所在。我现在要做的是添加一个全局布尔变量 RealExit = False。从托盘图标退出时,将布尔值设置为 True。并且仅在布尔变量为 False 时取消表单关闭事件。它解决了这个问题。您对这种做法有何评论?我有“退出到系统托盘然后退出”的正确方法吗?
    • 这是合理的。在 Form Closing 事件参数中还有一个 CloseReason 属性。如果 (e.CloseReason == CloseReason.ApplicationExitCall) 你可以这样做,并且一切就绪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多