Script de PowerShell para mantener la pantalla activa [3 formas]
Usando el bucle while con el método SendKeys()
Utilice el bucle while para invocar el método SendKeys() durante un tiempo ilimitado para mantener activa la pantalla de la PC/portátil mediante PowerShell.
Utilice el bucle while con el método SendKeys():
$wScriptShellObj = New-Object -Com "Wscript.Shell"
while (1) {
$wScriptShellObj.SendKeys(".")
Sleep 2
}Aquí, utilizamos el cmdlet New-Object para crear una instancia del objeto Shell WSH (Windows Script Host) usando tecnología COM (Component Object Model) y lo almacenamos en $wScriptShellObj. Este objeto permite que el script interactúe con el shell de Windows y ejecute diferentes comandos del shell.
Luego, ingresamos a un bucle infinito usando while(1) que lo mantendría ejecutándose hasta que el script terminara usando Ctrl+C. Dentro del bucle, utilizamos el método SendKeys() del objeto $wScriptShellObj, que enviaba el . a una aplicación activa una vez cada . >2 segundos. Si abrimos NotePad, el script ingresó puntos allí, y si abrimos NotePad++, imprimió puntos allí.
El método SendKeys() simuló la pulsación de tecla como si la hubiera escrito/ingresado el usuario. Después de cada pulsación de tecla, el script se detuvo durante 2 segundos usando el comando Sleep y luego continuó con la siguiente iteración del bucle while. De esta forma podremos mantener activa la pantalla de nuestro PC.
Usando el bucle while con el método SendWait()
Utilice el bucle while para llamar al método SendWait() durante un tiempo ilimitado para mantener activa la pantalla de la PC/portátil usando PowerShell. Presione Ctrl+C para finalizar el script.
Utilice el bucle while con el método SendWait():
while ($true) {
[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
[System.Windows.Forms.SendKeys]::SendWait("{NUMLOCK}")
Start-Sleep -Seconds 2
}Nuevamente, usamos un bucle while que se ejecutaría ilimitadamente porque la condición $true siempre sería Verdadera. Dentro del bucle while, utilizamos el método LoadWithPartialName() de la clase System.Reflection.Assembly. Recuerde que [System.Reflection.Assembly] se refería a la clase System.Reflection.Assembly en .NET, que proporcionaba propiedades y métodos para trabajar con ensamblados.
Usamos el método LoadWithPartialName() especificando 'System.Windows.Forms' como argumento para cargar el ensamblado System.Windows.Forms. en la sesión actual de PowerShell. La conversión [void] se usó para descartar cualquier valor o salida de la llamada al método LoadWithPartialName(). Además, se utilizó para suprimir cualquier valor producido al cargar el ensamblaje.
¿Por qué cargamos el ensamblado System.Windows.Forms? La carga era obligatoria para garantizar que la clase System.Windows.Forms.SendKeys estuviera disponible para su uso y proporcionara métodos para simular las pulsaciones de teclas.
Ahora, usamos el método SendWait() de la clase System.Windows.Forms.SendKeys para simular presionar la tecla NumLock. Aquí, la cadena "{NUMLOCK}" se pasó como argumento al método SendWait(); este argumento de cadena especificaba la secuencia de pulsaciones de teclas que se enviarían.
Después de eso, usamos el cmdlet Start-Sleep para dormir durante dos segundos. Este cmdlet aseguró que las declaraciones dentro del bucle se ejecutarían cada dos segundos. De esta manera, podemos evitar que nuestra PC/Laptop entre en modo de suspensión o bloqueo de pantalla simulando pulsaciones de teclas y enviándolas a una ventana o aplicación activa.
Usando el método keybd_event()
Utilice el método keybd_event() para mantener activa la pantalla de la PC/portátil de forma ilimitada mediante PowerShell. Presione Ctrl+C para detener este script.
Utilice el método keybd_event():
$pInvokeSignature = @'
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
'@
Add-Type -MemberDefinition $pInvokeSignature -Namespace Win32Functions -Name KeyboardFunctions
while ($true) {
[Win32Functions.KeyboardFunctions]::keybd_event(0x90, 0, 0, 0)
[Win32Functions.KeyboardFunctions]::keybd_event(0x90, 0, 2, 0)
Start-Sleep -Seconds 2
}
Primero, definimos una firma PInvoke para keybd_event() desde user32.dll en C#. Esta firma se almacenó en la variable $pInvokeSignature, que permitía invocar la función keybd_event() desde PowerShell usando el cmdlet Add-Type. Analicemos la firma para comprenderla antes de sumergirnos en Add-Type y seguir adelante.
Para definir una firma, utilizamos la construcción @''@, conocida como literal de cadena textual, para definir una cadena de varias líneas sin interpretar secuencias de escape ni caracteres especiales de escape. @' y '@ se usaron para iniciar y finalizar la cadena textual en PowerShell. Todo lo que había entre ellos se tomó como una cadena literal, incluidos los caracteres especiales y los saltos de línea.
A continuación, [DllImport("user32.dll")] especificó que el método keybd_event() se importaría desde la biblioteca user32.dll. . Después de eso, declaramos el Método keybd_event() con su firma. A continuación se muestra una breve explicación de los diferentes componentes de la declaración de la función keybd_event():
publicespecificó que se puede acceder a la función fuera de la clase.staticindica que la función es un métodostaticde la clase, accesible sin crear una instancia de la clase.externdenota que la función se implementó externamente; en el ejemplo anterior, se implementó en la bibliotecauser32.dll.voidera el tipo de retorno de la función que mostraba quekeybd_event()no devolvería ningún valor.byte bVkera un parámetro de tipobyteque representaba un código de clave virtual de la clave dada que queríamos simular.byte bScanera un parámetro de tipobyteque mostraba el código de escaneo de hardware de una clave que debía simularse.uint dwFlagsera de tipounit(entero sin signo), lo que denota los indicadores adicionales para controlar el evento clave.uint dwExtraInfotambién era de tipouint(entero sin signo), utilizado para información adicional asociada con las pulsaciones de teclas.
Usamos el cmdlet Add-Type para agregar el tipo C# personalizado (KeyboardFunctions) a la sesión actual de PowerShell. Este tipo se definió en el espacio de nombres Wind32Functions y tenía la declaración PInvoke de la función keybd_event(). Usamos varios parámetros con el cmdlet Add-Type:
- Usamos el parámetro
-Namepara mencionar el tipo C# personalizado. - El parámetro
-Namespacese utilizó para especificar el nombre del espacio de nombres. - El parámetro
-MemberDefinitionse usó para escribir la variable de firma PInvoke ($pInvokeSignature).
Después de eso, usamos el bucle while, que siempre sería verdadero debido a que se especifica la condición $true. Dentro del bucle, invocamos el método keybd_event() y pasamos cuatro argumentos que se explican a continuación:
0x90denota el código de clave virtual para la clave NUMLOCK; Puedes encontrar más códigos virtuales aquí.0era el código de escaneo del hardware.0indicó la banderaKEYEVENTF_KEYDOWN, lo que significa que se presionó la tecla.- El cuarto argumento era
0porque no queríamos información adicional sobre las pulsaciones de teclas.
Nuevamente invocamos el método keybd_event() con 0x90, 0, 2 y 0 como primer, segundo, tercer y cuarto argumento. De todos modos, la primera llamada a la función , significa la llave fue liberada.keybd_event(), excluyendo el tercer argumento, que era 2, que denota el indicador KEYEVENTF_KEYUP
Luego, usamos el cmdlet Start-Sleep para pausar la ejecución del script durante 2 segundos, que especificamos usando el parámetro -Seconds. De esta manera, simulamos presionar y soltar la tecla NUMLOCK cada dos segundos durante un tiempo ilimitado para evitar que la PC entre en modo de suspensión.
La función
keybd_event()está disponible pero ha sido reemplazada en versiones más recientes de Windows, por lo que se recomienda utilizar alternativas; por ejemplo, los métodosSendKeys()ySendWait()que aprendimos anteriormente en este artículo.
Se trata de scripts de PowerShell para mantener la pantalla activa.
