busca por:
WM_QUERYENDSESSION
WM_POWERBROADCAST
Gracias, tu respuesta me ha llevado por un camino que desconocía. Según parece
WM_QUERYENDSESSION envía un mensaje a windows (¿xp?, vista, 7, 8 .. ) que debe bloquear el cierre y mostrar un mensaje mostrando las aplicaciones que están por terminar.
Y
WM_POWERBORADCAST informa a las aplicaciones de un cambio en el evento de energía, que ocurre por ejemplo cuando se reanuda una sesión o se inicia.
No veo todavía como puedo usarlo para lo que necesito
. Pero encontré un ejemplo en C++ y lo pasé a .Net.
Public Class Form1
<System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function ShutdownBlockReasonCreate(ByVal hwnd As IntPtr, _
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.LPWStr)> ByVal reason As String) As Boolean
End Function
<System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function ShutdownBlockReasonDestroy(ByVal hwnd As IntPtr) As Boolean
End Function
Private Bloqueado As Boolean = False
Protected Overrides Sub WndProc(ByRef aMessage As Message)
Const WM_QUERYENDSESSION As Integer = &H11
If Bloqueado = True And aMessage.Msg = WM_QUERYENDSESSION Then
Return
End If
MyBase.WndProc(aMessage)
End Sub
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If ShutdownBlockReasonCreate(Me.Handle, TextBox1.Text) Then
Bloqueado = True
MessageBox.Show("Shutdown blocking tuvo éxito")
Else
MessageBox.Show("Shutdown blocking fallido")
End If
End Sub
Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If ShutdownBlockReasonDestroy(Me.Handle) Then
Bloqueado = False
MessageBox.Show("Shutdown unblocking tuvo éxito")
Else
MessageBox.Show("Shutdown unblocking fallido")
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
Lo que hace es que si se pulsa el Button1, se bloquea el cierre y aparece un mensaje notificando que mi aplicación no ha terminado la tarea cuando se cierra windows. Y el TextBox es para introducir el mensaje a mostrar vinculado a nuestra aplicación y que queremos que muestre en relación a la supuesta tarea que faltaría por terminar. Y el Button2 lo desbloquea.
S2s