La Web del Programador: Comunidad de Programadores
 
    Pregunta:  11079 - AL CERRAR WINDOWS, EJECUTAR UN COMANDO
Autor:  Alex Mauri
Muy buenas a todos.

Mi pregunta es la siguiente:
Tengo una aplicación en memoria durante la ejecución de Windows. Entonces, quiero que si se cierra Windows, mi programa lo sepa y aparezca un mensaje haciendo una preguntita. Si la respuesta es afirmativa, quiero que se grabe una registro en una base de datos Access. Pues bien, yo he puesto la pregunta en el QueryUnLoad y el programa sabe, por la variable que me devuelve este evento, si se está cerrando Windows. El mensaje se muestra correctamente, pero si la respuesta es afirmativa, por lo tanto graba un registro, hay un error numero 5. ¿Porque sucede esto? ¿Es posible que sea porque Windows ya ha empezado a apagarse y no sea posible ejecutar ningún comando? ¿Puedo hacer algo para pausar el cierre de Windows?
Bueno, no se si me he explicado bien. Si alguien no me entiende, por favor enviarme un email.

Gracias por todo, y que paseis un buen día.

Adios.

  Respuesta:  SuNcO
Tarde un poco pero ya encontre como hacerlo y es con una API

Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

Esa linea ya sabes, se pone hasta arriba de tu proyecto

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If Form1.Tag <> "ya" Then
Cancel = True
variable = ExitWindowsEx(1, 1) ' este es para ke no se cierre Windows
' aki proceso de guardar o no se ke kieres
Form1.Tag = "ya"
End ' aki va a volver al QueryUnload
End If
variable = ExitWindowsEx(1, 0) ' ahora ke si se cierre, aunke es linea opcional

fin:
End Sub