Visualizzazione post con etichetta System.Windows.Forms. Mostra tutti i post
Visualizzazione post con etichetta System.Windows.Forms. Mostra tutti i post

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.




martedì 18 gennaio 2022

PowerShell: Catturare uno screenshot

Tramite PowerShell è possibile catturare lo schermo e salvare lo screenshot all'interno di un file utilizzando i tipi presenti in System.Windows.Forms. Il seguente script mostra come catturare lo schermo virtuale e salvarlo all'interno di un file bitmap per poi aprirlo con il programma associato.
  #specifica il path in cui salvare lo screenshot   
  $Path = "$Env:temp\screenshot.bmp"   
     
  Add-Type -AssemblyName System.Windows.Forms   
     
  #Prepara l'area da catturare   
  $screen = [System.Windows.Forms.SystemInformation]::VirtualScreen   
  $width = $screen.Width   
  $height = $screen.Height   
  $left = $screen.Left   
  $top = $screen.Top   
  #Crea un immagine bitmap   
  $bitmap = [System.Drawing.Bitmap]::new($width, $height)   
  #Crea un nuovo oggetto Graphics dall'oggetto $bitmap   
  $MyDrawing = [System.Drawing.Graphics]::FromImage($bitmap)   
  #Copia il contenuto dello schermo nell'oggetto $bitmap   
  $MyDrawing.CopyFromScreen($left, $top, 0, 0, $bitmap.Size)   
     
  #Salva lo screenshot nel percorso specificato   
  $bitmap.Save($Path)   
  #visualizza l'immagine bmp salvata utilizzando il programma associato   
  Start-Process -FilePath $Path   


Screenshot
FIG 1 - Screenshot

Dal seguente link è possibile scaricare il codice dello script: