Por ahí encontré algo hace unos días en el foro, te lo envio tal cual lo copié (disculpas al autor):
El código es el siguiente:
A nivel de módulo las siguientes declaraciones:
Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Public Const EWX_LOGOFF = 0
Public Const EWX_SHUTDOWN = 1
Public Const EWX_REBOOT = 2
Public Const EWX_FORCE = 4
Yo he creado un formulario con cuatro botones, el código es el siguiente:
Private Sub cmdLogOff_Click()
´Arranca con otro usuario reiniciando los programas del menu de inicio
ret = ExitWindowsEx(EWX_LOGOFF, 0)
End Sub
Private Sub cmdReboot_Click()
´Reinicia el ordenador
ret = ExitWindowsEx(EWX_REBOOT, 0)
End Sub
Private Sub cmdRestart_Click()
´Cambia el usuario sin reiniciar programas
ret = ExitWindowsEx(EWX_FORCE, 0)
End Sub
Private Sub cmdShutDown_Click()
´Apaga el ordenador
ret = ExitWindowsEx(EWX_SHUTDOWN, 0)
End Sub
Nota: Este código lo único que hace es apagar o reiniciar el ordenador, sería conveniente antes de hacer esto crear una función que cierre todas las aplicaciones abiertas, ya que esto no se hace por si solo, y por ejemplo yo he hecho pruebas y como tengo el Explorer 4.0 con el Active Desktop cada vez que reinicio o apago el ordenado al volver me dice que hay que restaurar el Escritorio.
J. Ramón