Lo que necesito es que cuando pinches en apagar o cerrar sesion en windows, mi programa pueda hacer siertas acciones antes de cerrarse el windows.
-Detectar el cierre de windows
-Ejecutar accion
-Dejar que windows cierre
A lo mejor si pones en form_unload de tu programa que guarde esos datos al cerrar sesion o apagar el pc este forzara el cierre de la aplicacion y esta antes de cerrar realice la accion.
Prueba y comenta si funciona.
Lamentablemente eso ya lo e provado y nada. Al cerrar windows, cierra la aplicacion sin dejarla ni respirar.
Lo encontre. Este codigo hace que salte un mensaje cuando detecta que el pc va a ser apagado.
Codigo en un modulo
Option Explicit
' Declaraciones de funciones Api
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Long, _
ByVal Hwnd As Long, _
ByVal MSG As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
ByVal Hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
'Constantes
'''''''''''''''''''''''
' mensajes de windows
Public Const GWL_WNDPROC = -4
Public Const WM_QUERYENDSESSION = &H11
Global Const WM_CANCELMODE = &H1F
Global lpPrevWndProc As Long
'Crea el Hook
'''''''''''''''''''''''''''''''''''
Public Sub Hook(Hwnd_Form As Long)
lpPrevWndProc = SetWindowLong(Hwnd_Form, GWL_WNDPROC, AddressOf WindowProc)
End Sub
' Elimina el Hook
'''''''''''''''''''''''''''''''''''
Public Sub Unhook(Hwnd_Form As Long)
Dim ret As Long
ret = SetWindowLong(Hwnd_Form, GWL_WNDPROC, lpPrevWndProc)
End Sub
'Función que gestiona los mensajes
Function WindowProc(ByVal Hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
' Mensaje de cierre de sesión o de sistema
If uMsg = WM_QUERYENDSESSION Then
' el valor WM_CANCELMODE anula el cierre
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, WM_CANCELMODE, wParam, wParam)
MsgBox "Se intentó apagar Windows", vbInformation
' sale
Exit Function
End If
' continua
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, uMsg, wParam, lParam)
End Function
Codigo del formulario
Option Explicit
Private Sub Form_Load()
'Creamos el Hook ( Le pasa el Hwnd del formulario)
Hook Me.Hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Eliminamos el Hook
Unhook Me.Hwnd
End Sub
Url:http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/22.htm (http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/22.htm)
Hola, probá con este code, (creo que me lo pasó Leandro), con XP, si mal no recuerdo funcionaba bien , con windows seven no.
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = 2 Then
MsgBox "se esta apagando"
End If
End Sub
Saludos
jeje una vez probe ese codigo y casi me arruina la maquina, porque al apagarse y cuando salta el msgbox ya se descargaron cosas de memoria y programas vitales como el antivirus y demas, y cuando vuelve a la normalidad no estan mas cargados y queda todo medio feo :xD
saludos.
Bueno, Seba, entonces lo descartamos hasta estar seguros, estoy probando el W7,pero en cuanto pueda lo pruebo en XP
Saludos
No se que pasa con el codigo que postee.
con el msgbox funciona perfectamente, detiene el reinicio. Pero si intento que ejecute mas codigo no funciona y se reinicia. alguien save que es lo que puede estar pasando?.
Esto funciona perfectamente.
Function WindowProc(ByVal Hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
' Mensaje de cierre de sesión o de sistema
If uMsg = WM_QUERYENDSESSION Then
' el valor WM_CANCELMODE anula el cierre
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, WM_CANCELMODE, wParam, wParam)
MsgBox "Se intentó apagar Windows", vbInformation ----->Se ejecuta despues de detener el apagado
' sale
Exit Function
End If
' continua
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, uMsg, wParam, lParam)
Pero aki no me detiene el apagado.
Function WindowProc(ByVal Hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
' Mensaje de cierre de sesión o de sistema
If uMsg = WM_QUERYENDSESSION Then
' el valor WM_CANCELMODE anula el cierre
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, WM_CANCELMODE, wParam, wParam)
call myfunction ---------->>> ya no detiene el apagado
' sale
Exit Function
End If
' continua
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, uMsg, wParam, lParam)
Podrias usar Sleep para detener unos milisegundos el SO en el codigo ya provisto anteriormente y asi dejar ejecutar la parte de tu codigo.
En cuanto pruebe aviso de los resultados
cuando copio el codigo en VB3, me dice que: "expected parameter en las lineas: ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
señalando los guines bajos _
que hago?
Cita de: 70N1 en 23 Enero 2009, 23:27 PM
No se que pasa con el codigo que postee.
con el msgbox funciona perfectamente, detiene el reinicio. Pero si intento que ejecute mas codigo no funciona y se reinicia. alguien save que es lo que puede estar pasando?.
Esto funciona perfectamente.
Function WindowProc(ByVal Hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
' Mensaje de cierre de sesión o de sistema
If uMsg = WM_QUERYENDSESSION Then
' el valor WM_CANCELMODE anula el cierre
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, WM_CANCELMODE, wParam, wParam)
MsgBox "Se intentó apagar Windows", vbInformation ----->Se ejecuta despues de detener el apagado
' sale
Exit Function
End If
' continua
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, uMsg, wParam, lParam)
Pero aki no me detiene el apagado.
Function WindowProc(ByVal Hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
' Mensaje de cierre de sesión o de sistema
If uMsg = WM_QUERYENDSESSION Then
' el valor WM_CANCELMODE anula el cierre
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, WM_CANCELMODE, wParam, wParam)
call myfunction ---------->>> ya no detiene el apagado
' sale
Exit Function
End If
' continua
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, uMsg, wParam, lParam)
[OFF TOPIC]
Lei mal perdon.