viernes, julio 11, 2008

Detectar Shutdown de Windows desde un programa en VB 2003 .NET

Hablemos un poco de programación o software.. solo quiero documentar este problema que tuve cuando estaba implementando una característica a un programita que estaba haciendo, la característica es que, como el programa queda cargado en memoria, y muestra un icono en el 'tray', requería que cuando se hiciera log-off o shutdown a la computadora, el programa terminara.
El problema que existía es que cancelaba el apagado del sistema, hasta que primero se cerrara la aplicación.
Bien, como esa característica ya la había implementado en otros programas pero en versiones anteriores de VB, creí que podría implementarla mas o menos de alguna forma parecida. Pero no... tuve que experimentar otras cosas diferentes en VB2003, pero no me funcionaban, busque en la MSDN de Microsoft, pero no encontré algo que me sirviera. Así que, haciendo una búsqueda rápida en la red, encontré lo siguiente:

Esta es parte de la implementación, en el evento 'closing' de la forma:
If systemShutdown = False Then
e.Cancel = True
With Me
.WindowState = FormWindowState.Minimized
.Hide()
.tsrIcon.Visible = True
End With
Else
e.Cancel = False
End If
End Sub

Y este es el codigo "clave" para que lo anterior funcione:

Private Shared WM_QUERYENDSESSION As Integer = &H11
Private Shared SystemShutdown As Boolean = False

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_QUERYENDSESSION Then
'MessageBox.Show("queryendsession: this is a logoff,shutdown, or reboot")
systemShutdown = True
End If
' If this is WM_QUERYENDSESSION, the closing event should be fired inthe base WndProc
MyBase.WndProc(m)
End Sub 'WndProc

Si, si ya se que es realmente simple, y breve la solucion, y es precisamente por eso que quiero dejarlo anotado, que a veces las cosas que pudieran parecer simple y buscamos respuestas complejas, realmente la solucion es simple.

No hay comentarios.:

Publicar un comentario

Y USTED QUE OPINA?