winapi - studio - visual basic 6 windows 10
La aplicaciĆ³n de la bandeja del sistema VB 6.0 no se cierra con gracia cuando Windows se apaga (2)
Estoy usando el siguiente código dentro de una aplicación VB 6.0 para permitirle a la aplicación un ícono de bandeja del sistema:
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
Quiero que la aplicación se minimice en la bandeja del sistema al hacer clic en la X de la ventana para cerrarla. Lo logro con el siguiente código en el evento QueryUnload del formulario:
Me.WindowState = vbMinimized
Me.Hide
En el evento Unload del formulario, hago lo siguiente:
Shell_NotifyIcon NIM_DELETE, nid
El PROBLEMA es que cuando apago el sistema operativo y Windows envía el mensaje WM_CLOSE a la aplicación, QueryUnload se activa pero aparentemente no es el evento de descarga, ya que Windows me indica que quiere finalizar mi tarea.
¿Alguna idea sobre cómo hacer que la aplicación se cierre con gracia en el cierre de Windows?
Gracias
Esto es lo que uso cuando cierro mis programas para 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
Si el caso 2 (Windows Shutting Down), sigo adelante y dejo que el programa finalice.
¡Déjeme saber si esto ayuda! JFV
Aquí hay una implementación de ejemplo de vbnet http://vbnet.mvps.org/index.html?code/subclass/shellnotifybasic.htm