Monitor en mode Estalvi d’energia amb PowerShell
Seguint amb les ulilitats que pot donar el meu Stream Deck de Elgato i que anteriorment ja n’he parlat sobre treure profit amb Powershell.
Com alguns podeu saber, el meu escriptori és el terra, tinc el meu setup (monitors, stream deck, micro, etc) tot al terra davant la TV i moltes vegades em passa que vull veure la TV inmediatament i tinc que tancar els monitors perquè no molestin, així que vaig pensar que potser amb PowerShell podría fer-ho.
Una cerca ràpida per google em va portar a Windows Tip: 4 Different Ways to Turn Off Desktop Monitor or Laptop Screen ón expliquen entre altres coses, una crida amb un script de PowerShell.
Copiar i enganxar i l’script funciona perfectament, configuro tal i com vaig fer amb els altre botons de l’Stream Deck i els monitors entren en estalvi d’energia, l’únic inconvenient és que la finestra de PowerShell queda oberta i no m’interessa, molesta trobarla oberta al despertar els monitors.
function Set-DisplayOff { $code = @" using System; using System.Runtime.InteropServices; public class API { [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); } "@ $t = Add-Type -TypeDefinition $code -PassThru $t::SendMessage(0xffff, 0x0112, 0xf170, 2) } Set-DisplayOff
Una mica més investigació m’ha portat a descobrir que a part de SendMessage existeix PostMessage, que és dintre de la API Win32 la versió asincrona de SendMessage i per tant no interfereix en el fil d’execució.
Així que el codi de l’script final queda tal que:
function Set-DisplayOff { $code = @" using System; using System.Runtime.InteropServices; public class API { [DllImport("user32.dll")] public static extern int PostMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); } "@ $t = Add-Type -TypeDefinition $code -PassThru $t::PostMessage(0xffff, 0x0112, 0xf170, 2) } Set-DisplayOff