Skip to content

Instantly share code, notes, and snippets.

@jamesfreeman959
Last active April 30, 2024 04:23
Show Gist options
  • Save jamesfreeman959/231b068c3d1ed6557675f21c0e346a9c to your computer and use it in GitHub Desktop.
Save jamesfreeman959/231b068c3d1ed6557675f21c0e346a9c to your computer and use it in GitHub Desktop.
A very simple PowerShell script to keep a Windows PC awake and make lync think the user is active on the keyboard
# Useful references:
#
# https://superuser.com/questions/992511/emulate-a-keyboard-button-via-the-command-line
# https://ss64.com/vb/sendkeys.html
# https://social.technet.microsoft.com/Forums/windowsserver/en-US/96b339e2-e9da-4802-a66d-be619aeb21ac/execute-function-one-time-in-every-10-mins-in-windows-powershell?forum=winserverpowershell
# https://learn-powershell.net/2013/02/08/powershell-and-events-object-events/
#
# Future enhancements - use events rather than an infinite loop
$wsh = New-Object -ComObject WScript.Shell
while (1) {
# Send Shift+F15 - this is the least intrusive key combination I can think of and is also used as default by:
# http://www.zhornsoftware.co.uk/caffeine/
# Unfortunately the above triggers a malware alert on Sophos so I needed to find a native solution - hence this script...
$wsh.SendKeys('+{F15}')
Start-Sleep -seconds 59
}
@stringTrimmer
Copy link

I realize the original use case was to keep the Windows computer awake AND for another app (lync) to see keyboard activity. However for anyone who just needs the 1st part (to prevent Windows from sleeping and optionally keep the screen on) another solution was posted by @dend on his blog. You can also use the Awake utility from PowerToys which was created by the same author.

My use case: to keep the Windows machine hosting OpenSSH server awake when there is an active ssh connection using a pwsh session (seems like a bug in Windows OpenSSH tbh). I didn't need the screen to stay on and also didn't seem to require using a background thread as Den originally did (maybe something changed in .NET or PowerShell versions since his post, idk). So I just put this in my pwsh $PROFILE:

if (Test-Path env:SSH_CLIENT) { # only do this for a remote ssh user's session, but if that's not your thing remove this conditional
  $Signature=@"
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern void SetThreadExecutionState(uint esFlags);
  "@

    $ES_SYSTEM_REQUIRED = [uint32]"0x00000001"
    $ES_CONTINUOUS = [uint32]"0x80000000"
    $stes = Add-Type -MemberDefinition $Signature -Name System -Namespace Win32 -PassThru
    $stes::SetThreadExecutionState($ES_CONTINUOUS -bor $ES_SYSTEM_REQUIRED)
    Write-Host "Keeping computer awake"
}

If you need the screen to stay on change the script to use the appropriate flags with SetThreadExecutionState.

Thank you @dend

@dend
Copy link

dend commented Apr 18, 2024

@stringTrimmer thank you for the shout-out! 🥳

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment