Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VB 6.0 system tray application doesn't close gracefully when Windows shuts down

Tags:

winapi

vb6

I'm using the following code within a VB 6.0 application to allow give the application a system tray icon:

Option Explicit

'user defined type required by Shell_NotifyIcon API call
Public Type NOTIFYICONDATA
   cbSize As Long
   hwnd As Long
   uId As Long
   uFlags As Long
   uCallBackMessage As Long
   hIcon As Long
   szTip As String * 64
End Type

'constants required by Shell_NotifyIcon API call:
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201     'Button down
Public Const WM_LBUTTONUP = &H202       'Button up
Public Const WM_LBUTTONDBLCLK = &H203   'Double-click
Public Const WM_RBUTTONDOWN = &H204     'Button down
Public Const WM_RBUTTONUP = &H205       'Button up
Public Const WM_RBUTTONDBLCLK = &H206   'Double-click

Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean

Public nid As NOTIFYICONDATA

I want the application to minimize to the system tray when you click the Window's X to close it. I accomplish this with the following code in the form's QueryUnload event:

Me.WindowState = vbMinimized
Me.Hide

In the form's Unload event I do the following:

Shell_NotifyIcon NIM_DELETE, nid

The PROBLEM is that when I shut down the operating system and Windows sends the WM_CLOSE message to the app, QueryUnload is being fired but apparently not the Unload event, since Windows prompts me that it wants to end my task.

Any ideas on how to get the application to close gracefully on Windows shutdown?

Thanks

like image 914
Matthew Avatar asked Dec 12 '25 22:12

Matthew


2 Answers

This is what I use when I am closing my programs for the Query_Unload:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Select Case UnloadMode
        Case 1, 2, 3 'If the program is being terminated by Code, Windows shutting down, or Task Manager
            Cancel = False 'Allow the program termination
            Unload Me
        Case Else
            Cancel = True 'Else disallow the termination
    End Select
End Sub

If Case 2 (Windows Shutting Down), I go ahead and let the program terminate.

Let me know if this helps! JFV

like image 109
JFV Avatar answered Dec 15 '25 14:12

JFV


Here is an example implementation from vbnet http://vbnet.mvps.org/index.html?code/subclass/shellnotifybasic.htm

like image 33
Will Rickards Avatar answered Dec 15 '25 14:12

Will Rickards



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!