Ayuda.Auto guardar datos en txt antes de que se apague windows

Iniciado por 70N1, 23 Enero 2009, 17:36 PM

0 Miembros y 1 Visitante están viendo este tema.

70N1

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
70N1

viviz02

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.
tuentiAlert - Notificador de cambios en tu perfil de tuenti.

www.tuentialert.es
Ya esta disponible la v0.3 para descargar

70N1

Lamentablemente eso ya lo e provado y nada. Al cerrar windows, cierra la aplicacion sin dejarla ni respirar.
70N1

70N1

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
70N1

Dessa

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

Adrian Desanti

seba123neo

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.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Dessa

Bueno, Seba, entonces lo descartamos hasta estar seguros, estoy probando el W7,pero en cuanto pueda lo pruebo en XP

Saludos 
Adrian Desanti

70N1

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)
70N1

BlackZeroX

#8
Podrias usar Sleep para detener unos milisegundos el SO en el codigo ya provisto anteriormente y asi dejar ejecutar la parte de tu codigo.
The Dark Shadow is my passion.

70N1

70N1