VB.NET 用FormClosing实现最小化到托盘后Application.Exit()失效如何解决
解决方案
通过增加类级标志位区分关闭事件的触发来源,即可实现需求,具体实现如下:
- 在窗体类的全局区域(所有方法外部)声明布尔标记位,用来标识当前是否是主动发起退出操作:
Private _isExitRequested As Boolean = False
- 修改Quit按钮的点击事件逻辑,用户确认退出后先将标记位设为
True,再执行退出:
Private Sub btn_Quit_Click(sender As Object, e As EventArgs) Handles btn_Quit.Click Dim confirm As DialogResult = MessageBox.Show("你确定要退出应用吗?", "退出确认", MessageBoxButtons.YesNo) If confirm = DialogResult.Yes Then _isExitRequested = True Application.Exit() End If End Sub
- 调整
FormClosing事件逻辑,执行最小化到托盘逻辑前先判断标记位,主动退出的场景直接跳过最小化逻辑,允许窗体正常关闭:
Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing ' 主动退出时直接放行,不执行最小化逻辑 If _isExitRequested Then Return End If ' 原有最小化到托盘逻辑保留 NotifyIcon1.Visible = True NotifyIcon1.Icon = SystemIcons.Application NotifyIcon1.BalloonTipIcon = ToolTipIcon.Info NotifyIcon1.BalloonTipTitle = "后台运行中" NotifyIcon1.BalloonTipText = "应用正在后台运行,双击托盘图标即可恢复窗口" NotifyIcon1.ShowBalloonTip(50000) Me.Hide() ShowInTaskbar = True e.Cancel = True End Sub
补充说明
不推荐使用End强制终止进程,该方法会跳过正常的资源释放流程,容易出现资源泄漏问题。上述标志位方案完全贴合.NET的事件驱动设计逻辑,兼容性和稳定性更好。
内容的提问来源于stack exchange,提问作者charlie
相关产品推荐
相关产品推荐

