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 = &H0Sub 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 IfPublic 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