¿Cómo diseñar un programa de apagado programado usando VB? Por favor adjunte el código~
Respuesta:
El siguiente es el programa de cierre que quiero escribir para 98/XP/2000, puedes copiarlo. Usted mismo puede llamar las funciones de apagado y reinicio que escribí. La mayoría de los sistemas operativos actuales son 2000 o /p>
Entre ellos: hay declaraciones de funciones API antes de algunas declaraciones públicas.
Public Sub AdjustToken() Subrutina utilizada para obtener permiso de apagado.
Public Sub Shutdown() 'es una subrutina de apagado
Public Sub Reboot() 'es una subrutina de reinicio
********* ************ El código comienza: *******************
LUID de estructura pública
Dim UsedPart As Integer
Dim IgnoredForNowHigh32BitPart As Integer
Estructura final
Estructura pública LUID _AND_ATTRIBUTES
Atenuar TheLuid como LUID
Atenuar atributos como entero
Estructura final
Estructura pública TOKEN_PRIVILEGES
Atenuar PrivilegeCount como entero
Atenuar TheLuid como LUID
Atributos atenuados como entero
Estructura final
'Función de apagado forzado
Función de declaración pública ExitWindowsEx Lib "user32" (ByVal uFlags como entero, ByVal dwReserved As Integer) As Integer
'La función GetLastError devuelve el último código de error de este hilo. código de error. Los códigos de error se almacenan por subproceso
'Varios subprocesos no sobrescribirán los códigos de error de otros subprocesos.
Función de declaración pública GetLastError Lib "kernel32" () como entero
'La función GetCurrentProcess devuelve el identificador del proceso actual.
Función de declaración pública GetCurrentProcess Lib "kernel32" () como entero
'La función OpenProcessToken abre el token de acceso al proceso.
Función de declaración pública OpenProcessToken Lib "advapi32" (ByVal ProcessHandle como entero, ByVal DesiredAccess como entero, ByRef TokenHandle como entero) como entero
'La función LookupPrivilegeValue obtiene el valor utilizado en un objeto específico Identificador único local (LUID) del sistema
'Indica una prioridad específica.
'UPGRADE_WARNING: El LUID de estructura puede requerir que se pasen propiedades de sellado como parámetros en esta declaración de declaración. Haga clic aquí para obtener más información: "ms-helpMS.VSCC.2003/moner/redir/redirect?keyword="vbup1050""
Función de declaración pública LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA"(ByVal lpSystemName como cadena, ByVal lpName como cadena, ByRef lpLuid como LUID) como entero
'La función AdjustTokenPrivileges habilita o deshabilita la prioridad del token de acceso especificado.
'Habilitar o deshabilitar privilegios requiere acceso TOKEN_ADJUST_PRIVILEGES.
'UPGRADE_WARNING: La estructura TOKEN_PRIVILEGES puede requerir que se pasen propiedades de sellado como argumentos en esta declaración de declaración. Haga clic aquí para obtener más información: "ms-helpMS.VSCC.2003/moner/redir/redirect?keyword="vbup1050""
'UPGRADE_WARNING: la estructura TOKEN_PRIVILEGES puede requerir bloqueo en esta declaración de declaración Las propiedades se pasan como parámetros. PRIVILEGES puede requerir que las propiedades de manejo de sobres se pasen como parámetros en esta declaración.
Haga clic aquí para obtener más información: "ms-helpMS.VSCC.2003/moner/redir/redirect?keyword="vbup1050""
Función de declaración pública AjustarTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Integer, ByVal DisableAllPrivileges Como entero, byref newState como token_privileges, byval bufferLength como token_privileges, como token_privileges byval bufferLength como entero, byref anteriorState como token_privileges, byref returnlengm. ger )
'************************************ ***** *****************************
'* Este proceso establece la prioridad correcta para permitir el apagado o reinicio bajo Windows NT.
'****************************************** ******************************
SubAjusteToken público()
Const TOKEN_ADJUST_ PRIVILEGES Como Corto = H20s
Const TOKEN_QUERY Como Corto = H8s
Const SE_PRIVILEGE_ENABLED Como Corto = H2s
Dim hdlProcessHandle Como Integer
Dim hdlTokenHandle como entero
Dim tmpLuid como LUID
Dim tkp como TOKEN_PRIVILEGES
Dim tkpNewButIgnored como TOKEN_PRIVILEGES
Dim lBufferNeeded como entero
Dim lBufferNeeded como entero
p>
'Utilice la función SetLastError para establecer el código de error en 0.
'Al hacer esto, si no hay ningún error, la función GetLastError devolverá 0
'''''''SetLastError 0
'El proceso GetCurrentProcess La función establecerá la variable hdlProcessHandle
hdlProcessHandle = GetCurrentProcess()
'''''Si GetLastError lt;gt 0 entonces
'''''; MsgBox "GetCurrentProcess error= =" amp; GetLastError
'''''End If
OpenProcessToken(hdlProcessHandle, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hdlTokenHandle)
'' '''Si GetLastError lt; gt; 0 Entonces
'''''MsgBox "OpenProcessToken error==" amp; GetLastError
'''''End If
' Obtiene la prioridad de apagado LUID
LookupPrivilegeValue("", "SeShutdownPrivilege", tmpLuid)
'''''If GetLastError '''''End If tkp.PrivilegeCount = 1 'Establecer prioridad ' UPGRADE_WARNING: Error al analizar las propiedades predeterminadas del objeto tkp.TheLuid. Haga clic para obtener más información: "ms-helpMS.VSCC.2003/moner/redir/redirect?keyword="vbup1037"" tkp.TheLuid = tmpLuid Attributes = SE_PRIVILEGE_ENABLED. 'Habilitar prioridad de apagado para el proceso actual AjustarTokenPrivileges(hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded) ' ''' 'Si GetLastError '''''MsgBox "AdjustTokenPrivileges error==" & GetLastError '''''End If p> End Sub Public Sub Shutdown() 'Apagar subrutina '****************** Según la versión de Windows cerrada** ********************** Si glngWhichWindows32 = mlngWindowsNT Entonces AjustaToken() 'Llamar a obtener subrutina de prioridad Finalizar si Salir de WindowsEx (EWX_SHUTDOWN o EWX_FORCE, y HFFFF) '************ ***** ********************************************** **** End Sub Public Sub Reboot() 'Reiniciar subrutina '****************** ** *** Cerrar según la versión de Windows************************ Si glngWhichWindows32 = mlngWindowsNT Entonces AjustarToken () 'Llamar a la subrutina de prioridad End If ExitWindowsEx(EWX_REBOOT Or EWX_FORCE, amp; HFFFFs) '**** ***** ******************** ************************* ***** ******** Fin del subtítulo