Reiniciar Windows

Unas funciones del API para reinciar Windows, tanto en 16 cómo en 32 bits.

 
Revisión del 4/Oct/97


Además de un programilla algo más "lleno" de opciones, realmente fue la primera versión de este tipo de programas que hice.
Está hecho en VB3 y no recuerdo si lo llegué a probar con Windows95


Esta utilidad la usaba antes con el Win3.xx. Después la adapté para el Windows 95 y la hice en 32 bits.
Incluyo los listados... como viene siendo habitual, para que puedas "aprender", ya que considero que una de las mejores formas de aprender es viendo código... por eso en mis páginas hay tanto código: ¡pa que aprendas!

Nos vemos.


Nota: Para los dos primeros, incluir el código en un módulo BAS

 

Esta es la versión para 16 bits: (VB3...)

'----------------------------------------------------------
' gsIniW (Reiniciar Windows)                Versión 16 bits
'
' (c) Guillermo Som Cerezo                      (18/May/95)
'
' Utilidad para reiniciar windows.
' Muestra también la memoria y recursos libres. ( 1/Sep/96)
'
'----------------------------------------------------------
Option Explicit

Declare Function ExitWindows Lib "User" (ByVal ReStartCode As Long, ByVal DosReturnCode As Integer) As Integer
'Obtener la memoria y recursos libres           ( 1/Sep/96)
Declare Function GetFreeSpace Lib "Kernel" (ByVal wFlags As Integer) As Long
Declare Function GetFreeSystemResources Lib "User" (ByVal fuSysResource As Integer) As Integer
Const GFSR_SYSTEMRESOURCES = &H0
Sub Main()
    Dim Memoria&, m$

    Memoria& = GetFreeSpace(0)
    m$ = "Recursos libres: " & GetFreeSystemResources(GFSR_SYSTEMRESOURCES) & "%"
    m$ = m$ & " - Memoria libre: " & Format$(Memoria& \ 1024, "###,###,###") & " KB"

    If MsgBox(m$ & vbCrLf & vbCrLf & "¿Quieres reiniciar Windows?", 4 + 16 + 256, "Reiniciar Windows") = 6 Then
        Memoria& = ExitWindows(66, 0)
    End If
    End
End Sub

 

Esta es la versión para 32 bits: (VB4...)

Option Explicit
'--------------------------------------------------
' ReIniWin (Reiniciar Windows)          ( 8/Nov/95)
' (tengo una versión de Mayo'94)
'--------------------------------------------------
#If Win32 Then
    'Para usar con ExitWindowsEx
    Public Const EWX_LOGOFF = 0     'Termina la sesión actual
'    Public Const EWX_SHUTDOWN = 1   'Finaliza Windows
'    Public Const EWX_REBOOT = 2     'Reinicia el equipo
'    Public Const EWX_FORCE = 4      'Fuerza a terminar una aplicació que no responde
    Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
    'ExitWindows termina la sesión actual e inicia una nueva
    '(es decir reiniciar windows)
'    Public Declare Function ExitWindows Lib "user32" (ByVal dwReserved As Long, ByVal uReturnCode As Long) As Long
#Else
    Public Declare Function ExitWindows Lib "user" (ByVal ReStartCode As Long, ByVal DosReturnCode As Integer) As Integer
#End If
Public Sub Main()
    Dim msg As String

    Beep
    msg = "Este programa reiniciará Windows."
    If MsgBox(msg & vbCrLf & vbCrLf & "¿Seguro que quieres reiniciar Windows?", 4 + 16 + 256, "¡ ATENCIÓN !") = 6 Then
        'ReStart Windows
        #If Win32 Then
            If ExitWindowsEx(EWX_LOGOFF, 0&) Then
        #Else
            If ExitWindows(66, 0) Then
        #End If
            End If
    Else
        End
    End If
End Sub

 

Esta versión es para 16 bits y tiene unas cuantas cosas interesantes, creo...

Entre otras cosas, vuelvo a recordar que sólo la he probado en Windows 3.1x.
En este programa se cambia el "gráfico" del control box de la ventana, esto en Windows95 no tiene sentido, pero en Windows 3.1x si que lo tiene, ya no muestra el icono de la aplicación.
De todas formas, también es útil para poder usar el dibujo que quieras usar.

Acabo de probarlo, desde VB3 y me he dado cuenta que ya por esta época tenía en los botones (no en los gráficos, sino en las etiquetas) unos efectos esos de que se activa cuando pasas por encima de ellos...
También tiene, entre otras cosas, el método que usaba para saber el Ejecutable asociado con una extensión determinada, es que en aquellos tiempos no había caido en mis manos ningún código que lo hiciera, así que lo hice "por la cuenta de la vieja", mira el código de BuscarExtensión y verás porqué lo digo.

A lo mejor todo esto te parece complicado, pero... es cuestión de tomar la parte que te interese. ;-)

Veamos la pantalla de inicio:

La pantalla de ejecutar tareas:

Una captura en ejecución:

Ahora el código:

 

Ya que es un poco largo, te recomiendo que "bajes" el archivo ZIP (gswexit.zip 13.8 KB)
Aquí sólo voy a poner un par de cosillas.
Realmente, después de ver el código, mi intención con este programa fue el de distribuirlo de forma gratuita, lo que ocurre es que nunca llegué a hacerlo, echale un vistazo a lo que pretendía ser el Acerca de... (pero que nunca fué)
Insisto: esto era para el Windows 3.1x

'
Sub mnuGuille_Click ()
    'Este será el About...
    'La idea de hacer esta utilidad, surgió de poder
    'reiniciar Windows, sin tener que salir de Windows.
    'Ya que cuando se está programando, es necesario dejar
    'Windows como estaba al cargar, sin librerías que se
    'quedan 'colgadas' cuando no terminas correctamente el
    'programa y otras malas pasadas, sin ser 'desequilibradoras'.
    'Después fuí añadiendo opciones, tal como guardar una
    'lista de los últimos programas ejecutados; porque
    'también es desesperante el tener que probar un mísmo
    'programa y por no crear un icono, estar siempre 'Examinando'
    'la localización del mísmo. Así como querer ejecutar
    'los programas que vas 'descomprimiendo' en un directorio
    'temporal, para ir viendo si son interesantes...
    'No sé si este programa llegaré a 'distribuirlo', pero
    'que conste que cada día que pasa voy cambiando cosas,
    'según la información que voy 'acumulando'.
    'Información que viene de los programas Share, etc.
    '
    'Si tienes alguna rutina o truco del Api de Windows
    'que se pueda usar con VB, te agradecería que me la
    'mandaras, siempre es bueno 'saber' más.       Gracias.
End Sub
'Esta es la parte que dibuja el bitmap en el sitio del Menú de Control
'No recuerdo de dónde saque esta información:

Sub DrawBitmapNCArea (hWindow As Integer, hbmp As Integer, cxLeft As Integer, cyTop As Integer)

    Dim hdc%, hdcMem%
    Dim bmp As BITMAP
    Dim hbmpOld%
    Dim lprect As RECT
    Dim hinst%
    Dim rc&

    hinst = GetWindowWord(hWindow, GWW_HINSTANCE)
    hdc = GetWindowDC(hWindow)
    hdcMem = CreateCompatibleDC(hdc)

    rc = APIGetObject(hbmp, Len(bmp), bmp)
    hbmpOld = SelectObject(hdcMem, hbmp)
    rc = BitBlt(hdc, cxLeft, cyTop, bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, SRCCOPY)
    rc = SelectObject(hdcMem, hbmpOld)

    rc = DeleteDC(hdcMem)
    rc = ReleaseDC(hWnd, hdc)

End Sub
'Buscar el ejecutable asociado a una extensión (del archivo WIN.INI)

Function BuscarExtension (QueExt As String) As String
'----------------------------------------------------------
'Buscar una extensión en el fichero WIN.INI     ( 7/Nov/94)
'----------------------------------------------------------
    Dim WinDir As String
    Dim nf As Integer
    Dim stmp As String
    Dim EnExtensions As Integer
    Dim i As Integer

    WinDir = String$(255, 0)
    nf = GetWindowsDirectory(WinDir, Len(WinDir))
    WinDir = Left$(WinDir, nf)
    nf = FreeFile
    Open WinDir + "\WIN.INI" For Input As nf
    Do While Not EOF(nf)
        Line Input #nf, stmp
        If EnExtensions Then
            stmp = UCase$(LTrim$(stmp))
            'comprobar si no es otro grupo
            If Left$(stmp, 1) = "[" Then
                EnExtensions = False
                stmp = ""
                Exit Do
            End If
            If Left$(stmp, 3) = QueExt Then
                'Extensión hallada
                'Quitar los caracteres no válidos
                i = InStr(stmp, "^")
                If i Then
                    stmp = Left$(stmp, i - 1)
                End If
                i = InStr(stmp, "=")
                If i Then
                    stmp = LTrim$(Mid$(stmp, i + 1))
                End If
                Exit Do
            End If
        End If
        If InStr(stmp, "[Extensions]") Then
            EnExtensions = True
        End If
    Loop
    Close nf

    'Si no está definida esa extensión, usar el bloc
    If EnExtensions Then
        BuscarExtension = stmp
    Else
        BuscarExtension = "notepad"
    End If

End Function
'La parte que se encarga de cada una de las opciones:

Sub Image1_DblClick (Index As Integer)
    'Esto estaba antes en Click
    Dim sDOS As String
    Dim i As Integer

    Select Case Index
    Case 1              'Salir de Windows
        ExitWin 3
    Case 2              'Reiniciar Windows
        ExitWin 2
    Case 3              'Reiniciar el ordenador
        ExitWin 1
    Case 4              'Salir temporalmente al DOS
        'Comprobar cuál es el COMSPEC y ejecutarlo.
        sDOS = Trim$(Environ$("COMSPEC"))
        If Len(sDOS) Then
            'Ejecutar el archivo indicado en COMSPEC
            i = Shell(sDOS)
        Else
            'Si no hay COMSPEC, ejecutar COMMAND.COM
            i = Shell("command.com")
        End If
    Case 5              'Ejecutar un programa...
        Form2.Show 1
    Case 6              'Terminar el programa   ( 8/Nov/94)
        Unload Me
    End Select

End Sub

ir al índice