VB6 程序托盘后不触发QueryUnload事件

模块


Option Explicit
Public Const MAX_TOOLTIP As Integer = 64
Public Const NIF_ICON = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIM_DELETE = &H2
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Public Const SW_RESTORE = 9
Public Const SW_HIDE = 0
Public nfIconData As NOTIFYICONDATA
Public Type NOTIFYICONDATA
cbSize As Long
hWnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * MAX_TOOLTIP
End Type
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

 

 

窗体:

Function WindowStyle()

With nfIconData
.hWnd = Me.hWnd
.uID = Me.Icon
.uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
.uCallbackMessage = WM_MOUSEMOVE
.hIcon = Me.Icon.Handle

.szTip = "托盘中" & vbNullChar
.cbSize = Len(nfIconData)
End With
Call Shell_NotifyIcon(NIM_ADD, nfIconData)

Me.Hide
End Function
 

 Private Sub Form_Resize()
If Me.WindowState = 1 Then
WindowStyle
End If
End Sub

Private Sub Form_Load()

 Me.WindowState = 1   

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
msgbox "程序被强行终止!"
Call Shell_NotifyIcon(NIM_DELETE, nfIconData)

Shell  App.Path + "\" + App.EXEName & ".exe"


End Sub

按理来说程序被任务管理器强制关闭会执行QueryUnload事件,但是只要执行了托盘过程后,程序托盘到右下角在被任务管理器强制关闭则不执行QueryUnload事件,有没有解惑的!

 

被任务管理器强制关闭,如果你说的是结束进程,是不会触发QueryUnload的

以下内容部分参考ChatGPT模型:


对于VB6程序托盘后不触发QueryUnload事件的问题,可能是因为程序并没有真正的退出,所以不会触发该事件。可以考虑在程序退出前手动触发QueryUnload事件,或者在托盘图标的右键菜单中添加退出程序的选项,保证程序能够正常退出。

以下是手动触发QueryUnload事件的示例代码:

Private Sub Form_Unload(Cancel As Integer)
    If Not bExiting Then
        Cancel = True
        Me.Hide
        Call Form_QueryUnload(Cancel, UnloadMode)
    End If
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If UnloadMode = vbFormControlMenu Then
        ' 用户选择了关闭程序
        bExiting = True
        ' 执行程序退出操作
        ' ...
    End If
End Sub

其中,bExiting为一个全局变量,用于标识是否正在退出程序。在Form_Unload事件中,如果bExiting为False,则手动触发QueryUnload事件,并取消窗体的关闭操作;在Form_QueryUnload事件中,如果UnloadMode为vbFormControlMenu,则说明用户选择了关闭程序,此时将bExiting设置为True,执行程序退出操作即可。

希望以上内容能够帮助到提问者解决问题。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快