Quisiera saber como puedo apagar la computadora desde un formulario de FoxPro

siana8a
29 de Noviembre del 2003
Les doy las gracias, por favor ayudenme.

Luisen98
29 de Noviembre del 2003
Hola, te anexo un ejemplo cuyo autor se llama Balmes, puedes cambiar los valores dentro del parentesis, segun sea tu necesidad.

=apaga(.T.,.F.)
RETURN

*---------------------------------------------------------------*
FUNCTION APAGA( tlShutdownRequested, tlInteractiveShutdown )
*---------------------------------------------------------------*
* Por defecto - Cierra todas las aplicaciones y reinicia Windows sin preguntar.
* Parámetros:
*
* tlShutdownRequested - .T. Cierra Windows, .F. (default) Reinicia Windows
* tlInteractiveShutdown - .T. Muestra el cuadro de diálogo para preguntar si cerramos Windows, .F. (default) No pregunta nada y cierra Windows

* Esta función permite cerrar o reiniciar Windows desde VFP; hace las llamadas necesarias
* a funciones API de Windows para ajustar los privilegios necesarios en las plataformas Windows NT 4.0 o Windows 2000
* si se puede. La función devuelve .F. si no puede hacer los ajustes necesarios para garantizar que el privilegio
* llamado SE_SHUTDOWN_NAME sea establecido. En Windows 9x no es necesario establecer este privilegio.
* Probado en las plataformas WinNT 4.0 SP6, Win2K Pro, Win98 , WinME, WinXP pro.
* Probado en VFP 5.0, VFP 6.0 y VFP 7.0 SP1.
*

* Definición de constantes

#DEFINE SE_SHUTDOWN_NAME "SeShutdownPrivilege" && Nombre del privilegio de Windows NT y 2000
#DEFINE SE_PRIVILEGE_ENABLED 2 && Flag para activar privilegios
#DEFINE TOKEN_QUERY 2 && Token para consultar el estado
#DEFINE TOKEN_ADJUST_PRIVILEGE 0x20 && Token para ajustar privilegios
#DEFINE EWX_SHUTDOWN 1 && Apagar Windows
#DEFINE EWX_REBOOT 2 && Reiniciar Windows
#DEFINE EWX_FORCE 4 && Forzar el cierre de las aplicaciones
#DEFINE SIZEOFTOKENPRIVILEGE 16

* API de Windows para ejecutar ShutDown - Todas las versiones
DECLARE ExitWindowsEx IN WIN32API INTEGER uFlags, INTEGER dwReserved && API call to shut down Windows

* Comprobamos la versión de Windows para saber si hay que establecer privilegios
IF ('4.0' $ OS() OR '5.0' $ OS() OR 'NT' $ OS())
* APIs necesarias para manipular los permisos de los procesos

* Devuelve el LUID privilegio específico - changes each time Windows restarts
DECLARE SHORT LookupPrivilegeValue IN ADVAPI32 ;
INTEGER lpSystemName, ;
STRING @ lpPrivilegeName, ;
STRING @ pluid

* Obtiene el hToken con los permisos de un proceso
DECLARE SHORT OpenProcessToken IN Win32API ;
INTEGER hProcess, ;
INTEGER dwDesiredAccess, ;
INTEGER @ TokenHandle

* Ajusta otros privilegios de un proceso vía un hToken específico
DECLARE INTEGER AdjustTokenPrivileges IN ADVAPI32 ;
INTEGER hToken, ;
INTEGER bDisableAllPrivileges, ;
STRING @ NewState, ;
INTEGER dwBufferLen, ;
INTEGER PreviousState, ;
INTEGER @ pReturnLength

* Obtiene el Handle de un proceso
DECLARE INTEGER GetCurrentProcess IN WIN32API

LOCAL cLUID, nhToken, cTokenPrivs, nFlag

cLUID = REPL(CHR(0),8) && Identificador Unico Local de 64 bits de un privilegio

IF LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, @cLUID) = 0
RETURN .F. && Privilegio No definido en el proceso
ENDIF

nhToken = 0 && Token de un proceso usado para manipular los privilegios del mismo

IF OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY + TOKEN_ADJUST_PRIVILEGE , @nhToken) = 0
RETURN .F. && El sistema operativo no puede garantizar los privilegios necesarios
ENDIF

* Se crea la estructura TOKEN_PRIVILEGES , los 4 primeros bytes DWORD indican permisos,
* seguidos de un array(arreglo) de 8 bytes con los LUIDs y los últimos 4 bytes son los atributos
* de los permisos.
cTokenPrivs = CHR(1) + REPL(CHR(0),3) + cLUID + CHR(SE_PRIVILEGE_ENABLED) + REPL(CHR(0), 3)
IF AdjustTokenPrivileges(nhToken, 0, @cTokenPrivs, SIZEOFTOKENPRIVILEGE, 0, 0) = 0
RETURN .F. && Privilegio denegado o no permitido
ENDIF
ENDIF

CLOSE ALL && Cierra todas las tablas de VFP
FLUSH && Fuerza la escritura en disco de los Buffers
CLEAR EVENTS && Cancela eventos pendientes
ON SHUTDOWN && Reestablece el proceso SHUTDOWN
* Se comprueban los parámetros pasados
DO CASE
CASE tlShutdownRequested AND tlInteractiveShutdown
nFlag = EWX_SHUTDOWN
CASE tlShutdownRequested
nFlag = EWX_SHUTDOWN + EWX_FORCE
CASE tlInteractiveShutdown
nFlag = EWX_REBOOT
OTHERWISE
nFlag = EWX_REBOOT + EWX_FORCE
ENDCASE
=ExitWindowsEx(nFlag, 0) && Fuerza el Cierre o Reinicio de Windows
QUIT && Sale de VFP
ENDFUNC

Espero te sirva. Un abrazo.