venerdì 1 dicembre 2023

PowerShell: Muovere il puntatore del mouse

Tramite PowerShell è possibile muovere il puntatore del mouse utilizzando l'assembly System.Windows.Forms, che contiene le classi per gestire la finestra grafica.

PowerShell


Un semplice script che muove il mouse ogni 30 secondi è il seguente

 Add-Type -AssemblyName System.Windows.Forms  
 # Ciclo infinito che aggiorna la posizione del mouse ogni 30 secondi finchè non viene premuto CTRL+C o chiusa la finestra  
 while ($true)  
 {  
  # Rileva la posizione attuale del mouse  
  $Pos = [System.Windows.Forms.Cursor]::Position  
  # Creo le nuove coordinate del puntatore aggiungendo un pixel e facendo in modo da non uscire dallo schermo (% 500)  
  $x = ($pos.X % 500) + 1  
  $y = ($pos.Y % 500) + 1  
  # Posiziona il puntatore del mouse nelle nuove coordinate  
  [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)  
  # Attende 30 secondi  
  Start-Sleep -Seconds 30  
 }  
Nello script, per evitare che il mouse finisca fuori dallo schermo, è stato adottato un piccolo espediente: il valore delle coordinate viene diviso per 500 e viene prelevato il resto della divisione (che sarà sicuramente inferiore a 500).

Per muovere il cursore in maniera randomica sullo schermo si può utilizzare il seguente script
 Add-Type -AssemblyName System.Windows.Forms  
   
 # Rileva la risoluzione del monitor principale  
 $WindowSize = [System.Windows.Forms.Screen]::GetWorkingArea(0)  
 $MaxWidth = $WindowSize.Width  
 $MaxHeight = $WindowSize.Height  
   
 #Esegue un loop e aggiorna la posizione del mouse finché non viene premuto CTRL + C o viene chiusa la finestra  
 while ($true)  
 {  
   # Genera randomincamente le nuove coordinale tenendo conto della risoluzione  
   $x = (Get-Random -Minimum 0 -Maximum $MaxWidth)  
   $y = (Get-Random -Minimum 0 -Maximum $MaxHeight)  
   Write-Host "`rNew position: x:$($x),y:$($y)  " -NoNewLine  
   # Posiziona il cursore nelle nuove coordinate  
   [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)  
   # Attende 30 secondi  
   Start-Sleep -Seconds 30  
 }  
Per chi stesse pensando di utilizzare questo metodo per evitare che Windows vada in stand-by in caso di inattività, dovrà pensare ad una soluzione alternativa. Il movimento del mouse tramite PowerShell, infatti, non è sufficiente affinché il sistema venga considerato "attivo" e Windows provvederà comunque a visualizzare lo screensaver, oscurare/bloccare lo schermo o attivare il risparmio energetico dopo un periodo di inattività.
Per fare in modo che Windows rilevi che il pc sia utilizzato è necessario un input da parte dell'utente e non solo il movimento del mouse. Per simulare l'input da parte dell'utente, ad esempio la pressione di un tasto, si può utilizzare il metodo SendKeys che illustrerò in un altro articolo.




Nessun commento:

Posta un commento

I messaggi sono soggetti a moderazione da parte dell'amministratore prima della loro pubblicazione.