Site icon Gioxx.org

Storie di uno screenshot automatizzato via AutoHotkey

Installare Windows da chiave USB (WinToFlash)

Non starò qui a spiegarti “il perché e il per come“, puoi però partire da questo presupposto: avevo bisogno di uno screenshot che contenesse alcuni dettagli importanti tra cui il nome del PC, il giorno e l’ora corrente e uno scorcio del Pannello di controllo di Windows, in particolare Programmi e funzionalità, che mostrasse la versione di Office (Microsoft 365 Apps quando in abbonamento) installata a bordo macchina. Chi ha orecchie per intendere, intenda (cosa assai facile da comprendere per chi è del mestiere e ci è già passato), per tutti gli altri può essere spunto per adattare quanto realizzato a un uso anche differente.

AutoHotKey

Brevemente, AutoHotKey (autohotkey.com) è un linguaggio di scripting di automazione per Microsoft Windows. Spesso arriva a fare cose che un batch non può fare, simulando pure il comportamento umano davanti a tastiera e mouse se necessario. Mi ci sono imbattuto in passato senza mai applicarmi più del dovuto, ho realizzato qualche piccolo script che mi serviva per ripetere operazioni sempre identiche ma non ne avevo mai parlato prima nel blog. In merito ad AutoHotKey mi ritengo alla stregua di uno script-kiddie a oggi, eppure sono riuscito a portarmi a casa il risultato e come spesso accade ho deciso di pubblicare qui il tutto per metterlo a disposizione di te che stai leggendo.

Torniamo però allo screenshot.

Dovendo fare tutto con diritti utenti posso dirti che il pannello Programmi e funzionalità si apre senza diritti particolari, così come gli ms-settings: (le nuove impostazioni di Windows 10/11) che puoi richiamare da un banale Esegui. Puoi trovare una lista pressoché completa di scorciatoie all’indirizzo 4sysops.com/wiki/list-of-ms-settings-uri-commands-to-open-specific-settings-in-windows-10; per rispondere alla mia esigenza è bastata la ms-settings:about. Ho quindi le informazioni di sistema e le applicazioni installate. Quello che resta da fare è utilizzare il campo di ricerca in alto a destra nella finestra di Programmi e funzionalità per filtrare “Microsoft 365 Apps” e scattare una fotografia che raccolga tutti questi dettagli, possibilmente nascondendo gli altri aperti a monitor.

Per farlo ho quindi deciso di ingrandire a tutto schermo la finestra delle Impostazioni di Windows (con le informazioni di sistema) e ridurre invece l’altezza della finestra Programmi e funzionalità (spostandola in basso a destra nel monitor) per permettere di vedere chiaramente il filtro applicato ma senza sprecare preziosi pixel dello screenshot, mantenendo in vista – inevitabilmente – la barra delle applicazioni di Windows che contiene anche giorno e ora correnti. Tradotto in script AHK il risultato è grosso modo questo (fatta salva qualche mia sporcatura o ottimizzazione mancante):

; *********************** Header - some configuration  ***********************
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors. (disabled by default)
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
setTitleMatchMode, 2 ; set title match mode to "contains"

;Open System Properties
ActivateOrOpen("Impostazioni", "ms-settings:about")
WinMaximize

;Open Appwiz.cpl and search for M365Apps
ActivateOrOpen("Programmi e funzionalità", "appwiz.cpl")
WinMove, , , , , , 400, ,
WinGetPos X, Y, Width, Height
MaxX := A_ScreenWidth - Width
MaxY := A_ScreenHeight - Height - 30
WinMove, , ,%MaxX%, %MaxY%
Send, ^f
Send, "Microsoft 365 Apps"

Lo script prevede (vedi Send, "Microsoft 365 Apps") di filtrare il risultato in Programmi e funzionalità dopo aver lanciato un banale CTRL+F da tastiera (simulato, Send, ^f).

Per eseguire lo screenshot ho cercato online possibili alternative all’uso di uno strumento terza parte che avrei dovuto caricare all’interno di un unico pacchetto eseguibile (dato che AutoHotKey non lo prevede nativamente), e sono atterrato su questo thread dove si parla di uno strumento già a bordo del .NET Framework installato nel 99% dei casi in Microsoft Windows, quindi pulito, leggero, certamente digerito anche da Defender o soci. Ho scaricato il file batch (qui il codice, qui in alternativa se il primo link dovesse fallire) e l’ho eseguito per permettermi di generare l’eseguibile adatto a svolgere il mestiere (qui trovi copia dell’eseguibile se dovesse servirti, gira certamente su Windows a 64 bit, non l’ho provato su sistemi a 32 bit).

A questo punto basterà richiamarlo all’interno dello script AHK e – infine – chiudere le finestre precedentemente aperte richiamandole e lanciando da tastiera degli ALT+F4 (simulato, Send !{F4}):

;Take screenshot
Sleep 1000
FileCreateDir C:\Temp
;Run "%A_WorkingDir%\screenCapture.exe" "%A_ComputerName%.png"
Run "%A_WorkingDir%\screenCapture.exe" "C:\Temp\scrdel_%A_ComputerName%.png", , Min,

;Close Windows
Sleep 1000
ActivateOrOpen("Programmi e funzionalità", "appwiz.cpl")
Send !{F4}
ActivateOrOpen("Impostazioni", "ms-settings:about")
Send !{F4}

Per comodità ho deciso di creare la cartella C:\Temp (ammesso che non esista già, in tal caso la uso senza dover creare alcunché) e salvare al suo interno lo screenshot, questo perché – nel mio caso ho usato Quest Kace per automatizzare il tutto – facendogli creare lo screenshot nella cartella del programma (%A_WorkingDir%) rischiavo di scontrarmi con qualche diritto di scrittura negato; noterai che la stringa originale è rimasta seppur commentata (;Run "%A_WorkingDir%\screenCapture.exe" "%A_ComputerName%.png").

La funzione ActivateOrOpen che richiamo spesso nello script l’ho ereditata utilizzando il generatore di script AutoHotKey (più boilerplate per certi aspetti) che è disponibile pubblicamente all’indirizzo ahkgen.com (progetto open source disponibile su GitHub: github.com/mshafer1/AHK-generator):

ActivateOrOpen(window, program)
{
    ; check if window exists
    if WinExist(window)
    {
        WinActivate  ; Uses the last found window.
    }
    else
    {   ; else start requested program
         Run cmd /c "start ^"^" ^"%program%^"",, Hide ;use cmd in hidden mode to launch requested program
         WinWait, %window%,,5		; wait up to 5 seconds for window to exist
         IfWinNotActive, %window%, , WinActivate, %window%
         {
              WinActivate  ; Uses the last found window.
         }
    }
    return
}

Lo script completo l’ho pubblicato in un Gist che ti propongo qui di seguito:

; *********************** Header - some configuration ***********************
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors. (disabled by default)
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
setTitleMatchMode, 2 ; set title match mode to "contains"
;Open System Properties
ActivateOrOpen("Impostazioni", "ms-settings:about")
WinMaximize
;Open Appwiz.cpl and search for M365Apps
ActivateOrOpen("Programmi e funzionalità", "appwiz.cpl")
WinMove, , , , , , 400, ,
WinGetPos X, Y, Width, Height
MaxX := A_ScreenWidth - Width
MaxY := A_ScreenHeight - Height - 30
WinMove, , ,%MaxX%, %MaxY%
Send, ^f
Send, "Microsoft 365 Apps"
;Take screenshot
Sleep 1000
FileCreateDir C:\Temp
;Run "%A_WorkingDir%\screenCapture.exe" "%A_ComputerName%.png"
Run "%A_WorkingDir%\screenCapture.exe" "C:\Temp\scrdel_%A_ComputerName%.png", , Min,
;Close Windows
Sleep 1000
ActivateOrOpen("Programmi e funzionalità", "appwiz.cpl")
Send !{F4}
ActivateOrOpen("Impostazioni", "ms-settings:about")
Send !{F4}
ActivateOrOpen(window, program)
{
; check if window exists
if WinExist(window)
{
WinActivate ; Uses the last found window.
}
else
{ ; else start requested program
Run cmd /c "start ^"^" ^"%program%^"",, Hide ;use cmd in hidden mode to launch requested program
WinWait, %window%,,5 ; wait up to 5 seconds for window to exist
IfWinNotActive, %window%, , WinActivate, %window%
{
WinActivate ; Uses the last found window.
}
}
return
}

Trasformazione in eseguibile e utilizzo

Lo script c’è e funziona dai primi test. Considerato però che non avevo nessuna voglia di distribuire l’installazione di AutoHotKey, è servito fare uso di Ahk2Exe per trasformare lo script in file eseguibile capace di vivere su macchine che non hanno la benché minima idea di cosa sia AutoHotKey. Il pacchetto si scarica direttamente da GitHub, è portable per definizione, non necessita di alcuna installazione. Si esegue e si fornisce in pasto lo script da convertire (con possibilità di aggiungere alcune personalizzazioni, tra cui l’icona modificata).

Caricato lo script ed eventuali altri dettagli per te utili basterà un clic sul pulsante Convert per completare l’opera e ottenere l’eseguibile che puoi facilmente ridistribuire / eseguire da remoto come e dove necessiti. Io ho caricato l’eseguibile AHK e lo screenCapture.exe su Quest Kace e tramite un’operazione script (di Kace, NdR) ho lanciato il processo su un po’ di PC. A quel punto mi è bastato raccogliere gli screenshot che sono comparsi nelle varie C:\Temp (ho automatizzato anche questo aspetto).

Si poteva fare diversamente? Cosa aspetti allora, scrivimelo! Ogni proposta è bene accetta nei commenti, sarò felice di discuterne insieme a te e imparare, chi si ferma è perduto! 🙂

#StaySafe


Un po’ (tanti) ringraziamenti / spunti / riferimenti / link a documentazione (A-Z per comodità):
autohotkey.com/board/topic/10079-how-do-i-send-keycombinations-like-ctrl-f
autohotkey.com/board/topic/22991-minimize-all-windows
autohotkey.com/board/topic/72630-gui-bottom-right
autohotkey.com/board/topic/81404-how-to-use-computername-in-script
autohotkey.com/docs/v1/lib/FileCreateDir.htm
autohotkey.com/docs/v1/lib/Run.htm
autohotkey.com/docs/v1/lib/WinMaximize.htm
autohotkey.com/docs/v1/lib/WinMove.htm
autohotkey.com/docs/v2/lib/WinMove.htm
superuser.com/a/1717014

Correzioni, suggerimenti? Lascia un commento nell'apposita area qui di seguito o contattami privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! ☕ :-)

L'articolo potrebbe non essere aggiornato

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Condividi l'articolo con i tuoi contatti:
Exit mobile version