Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: 70N1 en 23 Enero 2009, 17:36 pm



Título: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: 70N1 en 23 Enero 2009, 17:36 pm
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


Título: Re: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: viviz02 en 23 Enero 2009, 17:49 pm
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.


Título: Re: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: 70N1 en 23 Enero 2009, 18:07 pm
Lamentablemente eso ya lo e provado y nada. Al cerrar windows, cierra la aplicacion sin dejarla ni respirar.


Título: Re: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: 70N1 en 23 Enero 2009, 18:21 pm
Lo encontre. Este codigo hace que salte un mensaje cuando detecta que el pc va a ser apagado.

Codigo en un modulo
Código:
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
Código:
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)


Título: Re: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: Dessa en 23 Enero 2009, 19:06 pm
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



Título: Re: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: seba123neo en 23 Enero 2009, 21:31 pm
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.


Título: Re: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: Dessa en 23 Enero 2009, 23:01 pm
Bueno, Seba, entonces lo descartamos hasta estar seguros, estoy probando el W7,pero en cuanto pueda lo pruebo en XP

Saludos 


Título: Re: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: 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.
Código:
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.
Código:
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)


Título: Re: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: BlackZeroX en 24 Enero 2009, 04:46 am
Podrias usar Sleep para detener unos milisegundos el SO en el codigo ya provisto anteriormente y asi dejar ejecutar la parte de tu codigo.


Título: Re: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: 70N1 en 25 Enero 2009, 20:47 pm
En cuanto pruebe aviso de los resultados


Título: Re: Ayuda.Auto guardar datos en txt antes de que se apague windows
Publicado por: iubens en 21 Diciembre 2010, 23:35 pm
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?

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.
Código:
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.
Código:
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)


Título: [OFF TOPIC]
Publicado por: 79137913 en 22 Diciembre 2010, 19:43 pm
[OFF TOPIC]
Lei mal perdon.