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
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! :-)