¿Existe alguna forma de salir automáticamente de un programa en Windows 7 cada vez que bloqueo la pantalla?
Respuesta1
Según la sugerencia de gragraty,no uses el archivo por lotes que puseal final de esta respuesta. Esto es porquerundll32.exe
no escoincide con la convención de llamada de la LockWorkStation
función API de Win32 (consulteesta entrada de blog de MSDNpara detalles). Dicho esto, existe una alternativa mejor, que no implica demasiado trabajo.
Puedes usar elLenguaje de scripting AutoIty elDllCall
función para llamar a una función API de Win32 sin dañar la pila de llamadas. También puedes utilizar elProcessClose
en lugar de TASKKILL
. Para tu referencia,aquí está elLockWorkStation
referencia del MSDN.
Coloque las siguientes dos líneas en un archivo y guárdelo como exitandlock.au3
(o algo similar). Luego puedes ejecutarlo con AutoIt (o incluso compilarlo en un .exe si lo deseas).
ProcessClose("yourapp.exe")
DllCall("user32.dll", "BOOL", "LockWorkStation")
Eso debería proporcionarle lo que desea, sin dañar la pila de llamadas. Luego puede vincular ese archivo a una tecla de acceso rápido y usarlo para bloquear su estación de trabajo. Alternativamente, puede compilarlo en un archivo .exe y configurarlo para que se ejecute como una tarea programada después de que su computadora esté inactiva.
Por último, es posible que también desee utilizar elWinClose
funcionar como una alternativa a ProcessClose
.
Como dije por favorno uses este método. Lo mantengo aquí sólo para que esté completo, ya que es una de las formas más utilizadas en Internet. Puedes usar un archivo por lotes simple para hacer esto usando el TASKKILL
comando:
@ECHO OFF
TASKKILL /IM yourapp.exe
Rundll32.exe User32.dll,LockWorkStation
Luego, simplemente ejecute el archivo por lotes cuando desee bloquear su estación de trabajo. Alternativamente, también puede asignar una tecla de acceso rápido para ejecutar el archivo por lotes y luego simplemente presionar esa combinación de teclas cuando desee bloquearlo. Para obtener más detalles sobre el TASKKILL
comando, consulteeste artículo de Microsoft.
Respuesta2
Paso 1: escriba un script que finalice el programa
Cree un archivo llamado terminate.vbs
con este contenido:
set objwmiservice = getobject("winmgmts:\\.\root\cimv2")
strprocessname = wscript.arguments.item(0)
strquery = "select * from win32_process where name='" & strprocessname & "'"
set colitems = objwmiservice.execquery(strquery,,48)
for each objitem in colitems
objitem.terminate
next
Pruebe este script abriendo un símbolo del sistema y ejecutando cscript.exe "C:\path\to\terminate.vbs" notepad.exe
. Reemplace notepad.exe
con el nombre del proceso que desea finalizar.
Paso 2: programe el script para que se ejecute cuando bloquee la pantalla
AbiertoProgramador de tareas(puedes buscarlo en el menú Inicio), haz clic derechoBiblioteca del programador de tareasy seleccioneCrear tarea.... Sobre elGeneralpestaña, asigne a su tarea un nombre y una descripción. Tu puedes cambiarConfigurar para:aWindows 7, servidor Windows 2008 R2si quieres, pero eso no es necesario.
Sobre elDesencadenantespestaña, cree un nuevo activador y establezcaComience la tarea:aEn el bloqueo de la estación de trabajo. El resto de las configuraciones predeterminadas están bien.
Sobre elComportamientopestaña, cree una nueva acción queiniciar un programa.Programa/guión:debiera sercscript.exe. Ingrese la ruta terminate.vbs
y el nombre del proceso que desea finalizar en elAgregue argumentos (opcional):caja. mis argumentos son"C:\Users\Public\Documents\terminate.vbs" notepad.exe
Puedes comprobar elCondicionesyAjustespestañas para ver más opciones, pero ninguna de ellas es necesaria aquí. Guarde la tarea y listo. Cuando bloqueas la pantalla, el proceso debería finalizar.
Tenga en cuenta que si bloquea la pantalla y luego la desbloquea rápidamente, es posible que vea una ventana de símbolo del sistema o que el proceso que desea finalizar aún esté en proceso de finalización. Esto depende de cuánto tiempo tarde el proceso en finalizar correctamente.
Respuesta3
Puedes escribir un programa usando WTSRegisterSessionNotification()
para esperarWTS_SESSION_LOCK
eventos y hacer las cosas necesarias.
Se puede encontrar un ejemplo en:https://superuser.com/a/264973/1686