Is it possible to take Steam screenshots without using the in-game overlay?

As the title states. Sometimes running with the steam overlay is a bad idea, but I find myself wanting to put screenshots on my Steam profile, which the built-in game screenshot functionality does not allow me to. Is there a way to accomplish that, be it via a trick, or running the overlay without actually overlaying anything?
Best Answer
I've tried to automate the process described by m0nde. It requires PowerShell to run, but if you have Windows 7 or newer you have it preinstalled.
Save this as run.bat
:
@powershell -NoProfile -ExecutionPolicy Bypass -File main.ps1
And this as main.ps1
:
Function Get-VDFContent ([string] $path)
{
$fileContent = Get-Content $path
$obj = @{}
$stack = New-Object System.Collections.Stack
$group = [regex] '^\s*"([^"]+)"\s*$'
$keyVal = [regex] '^\s*"([^"]+)"\s*"([^"]+)"\s*$'
$bracket = $False
ForEach ($line in $fileContent)
{
If ($bracket)
{
If ($line -Like "*{*")
{
$bracket = $False
}
}
ElseIf (($match = $group.Match($line)) -And $match.Success)
{
$obj.($match.Groups[1].Value) = @{}
$stack.Push($obj)
$obj = $obj.($match.Groups[1].Value)
$bracket = $True
}
ElseIf (($match = $keyVal.Match($line)) -And $match.Success)
{
$obj.($match.Groups[1].Value) = $match.Groups[2].Value
}
ElseIf ($line -Like "*}*")
{
$obj = $stack.Pop()
}
Else
{
Throw
}
}
Return $obj
}
Function Create-ScreenshotPath([string] $screenshots, [string] $date, [string] $i)
{
Return Join-Path $screenshots ($date + ($i.PadLeft(5, "0")) + ".jpg")
}
$steamPath = ""
If (Test-Path "HKCU:\Software\Valve\Steam")
{
$steamPath = (Get-ItemProperty "HKCU:\Software\Valve\Steam").SteamPath
}
If (-Not $steamPath)
{
$steamPath = Read-Host 'Enter Steam install folder path (example: "c:/program files (x86)/steam")'
}
$loginUsers = Join-Path $steamPath "config/loginusers.vdf"
$users = (Get-VDFContent $loginUsers).users
$lastUser = ($users.GetEnumerator() | Sort-Object { [int]$_.Value.Timestamp } -Descending)[0].Name
$lastUserShort = $lastUser - 0x110000100000000
$userPath = Join-Path $steamPath ("userdata/" + $lastUserShort)
$localConfig = Join-Path $userPath "/config/localconfig.vdf"
$apps = (Get-VDFContent $localConfig).UserLocalConfigStore.Software.Valve.Steam.apps
$lastPlayed = ($apps.GetEnumerator() | Sort-Object { [int]$_.Value.LastPlayed } -Descending)[0].Name
$screenshots = Join-Path $userPath ("760/remote/" + $lastPlayed + "/screenshots")
$thumbnails = Join-Path $screenshots "thumbnails"
New-Item -Force -ItemType directory -Path $thumbnails >$null
$scriptPath = Split-Path -parent $MyInvocation.MyCommand.Definition
$date = Get-Date -Format yyyy-MM-dd_
$i = 1
While (Test-Path (Create-ScreenshotPath $screenshots $date $i)) { $i++ }
$filesToMove = Get-ChildItem $scriptPath -Filter "*.jpg" | % { $_.FullName }
ForEach ($file in $filesToMove)
{
Move-Item $file (Create-ScreenshotPath $screenshots $date $i)
$i++
}
Now put those files in one directory with screenshots you want to upload and launch run.bat
. This script finds last logged-in user and last played game so keep it in mind before running.
Pictures about "Is it possible to take Steam screenshots without using the in-game overlay?"



What happens if I turn off Steam overlay?
If it is not enabled, the invites will not work. Steam allows screenshots to be captured in-game by using the default keybinding of F12. This feature requires the overlay to capture the screenshots. The screenshots can be accessed in-game by using the overlay as well.How do I take a screenshot while playing a game on Steam?
Steam makes it easy to take a screenshot within any game just by pressing the F12 function key. As soon as you do that, you should see a small notification that the screenshot has been saved to your computer.How do you take a screenshot on Steam without F12?
Yes. The only work around, is during any game, I'l open overlay ALT+TAB, press F12, then can screenshot directly after closing the overlay WITHOUT pressing anything else besides F12. So it's not really a fix, but a definate workaround. Alt + Printscreen will also work.How to Fix the Steam Screen Shot issue
More answers regarding is it possible to take Steam screenshots without using the in-game overlay?
Answer 2
A small modification to Piotr Kowalski's answer. Now it also makes thumbnails for your screenshots.
Take the file from this gist or just paste the code into your main.ps1
file:
# Modified version of @piotr-kowalski's script
# Now also makes thumbnails for screenshots
# https://gaming.stackexchange.com/a/238288/212957
#
# Note:
# This script finds last logged-in user and last played game so keep it in mind before running.
#
# Usage:
# 1) Save this as run.bat:
# @powershell -NoProfile -ExecutionPolicy Bypass -File main.ps1
# 2) Download this file
# 3) Put both files in one directory with screenshots you want to upload and launch run.bat.
Function Get-VDFContent ([string] $path)
{
$fileContent = Get-Content $path
$obj = @{}
$stack = New-Object System.Collections.Stack
$group = [regex] '^\s*"([^"]+)"\s*$'
$keyVal = [regex] '^\s*"([^"]+)"\s*"([^"]+)"\s*$'
$bracket = $False
ForEach ($line in $fileContent)
{
If ($bracket)
{
If ($line -Like "*{*")
{
$bracket = $False
}
}
ElseIf (($match = $group.Match($line)) -And $match.Success)
{
$obj.($match.Groups[1].Value) = @{}
$stack.Push($obj)
$obj = $obj.($match.Groups[1].Value)
$bracket = $True
}
ElseIf (($match = $keyVal.Match($line)) -And $match.Success)
{
$obj.($match.Groups[1].Value) = $match.Groups[2].Value
}
ElseIf ($line -Like "*}*")
{
$obj = $stack.Pop()
}
Else
{
Throw
}
}
Return $obj
}
Function Create-ScreenshotPath([string] $screenshots, [string] $date, [string] $i)
{
Return Join-Path $screenshots ($date + ($i.PadLeft(5, "0")) + ".jpg")
}
Function Save-Thumbnail([string] $imagePath, [string] $pathToSave)
{
$wia = New-Object -com wia.imagefile
$wia.LoadFile($imagePath)
$wip = New-Object -ComObject wia.imageprocess
$scale = $wip.FilterInfos.Item("Scale").FilterId
$wip.Filters.Add($scale)
$wip.Filters[1].Properties("MaximumWidth") = 200
$wip.Filters[1].Properties("MaximumHeight") = 150
#aspect ratio should be set as false if you want the pics in exact size
$wip.Filters[1].Properties("PreserveAspectRatio") = $true
$wip.Apply($wia)
$newimg = $wip.Apply($wia)
$newimg.SaveFile($pathToSave)
}
$steamPath = ""
If (Test-Path "HKCU:\Software\Valve\Steam")
{
$steamPath = (Get-ItemProperty "HKCU:\Software\Valve\Steam").SteamPath
}
If (-Not $steamPath)
{
$steamPath = Read-Host 'Enter Steam install folder path (example: "c:/program files (x86)/steam")'
}
$loginUsers = Join-Path $steamPath "config/loginusers.vdf"
$users = (Get-VDFContent $loginUsers).users
$lastUser = ($users.GetEnumerator() | Sort-Object { [int]$_.Value.Timestamp } -Descending)[0].Name
$lastUserShort = $lastUser - 0x110000100000000
$userPath = Join-Path $steamPath ("userdata/" + $lastUserShort)
$localConfig = Join-Path $userPath "/config/localconfig.vdf"
$apps = (Get-VDFContent $localConfig).UserLocalConfigStore.Software.Valve.Steam.apps
$lastPlayed = ($apps.GetEnumerator() | Sort-Object { [int]$_.Value.LastPlayed } -Descending)[0].Name
$screenshots = Join-Path $userPath ("760/remote/" + $lastPlayed + "/screenshots")
$thumbnails = Join-Path $screenshots "thumbnails"
New-Item -Force -ItemType directory -Path $thumbnails >$null
$scriptPath = Split-Path -parent $MyInvocation.MyCommand.Definition
$date = Get-Date -Format yyyy-MM-dd_
$i = 1
While (Test-Path (Create-ScreenshotPath $screenshots $date $i)) { $i++ }
$filesToMove = Get-ChildItem $scriptPath -Filter "*.jpg" | % { $_.FullName }
ForEach ($file in $filesToMove)
{
$thumbnailPath = (Create-ScreenshotPath $thumbnails $date $i)
(Save-Thumbnail $file $thumbnailPath)
Move-Item $file (Create-ScreenshotPath $screenshots $date $i)
$i++
}
Answer 3
Use SteaScree. It can upload screenshots from any source to the Steam cloud. This includes sources such as a game's built-in screenshot functionality, or other game screenshot software (e.g. Bandicam, FRAPS, Geforce Experience / Nvidia Ansel, etc.), bypassing the need for the Steam overlay.
SteaScree is a simple cross-platform open-source utility tool, which greatly simplifies the uploading of screenshots to the Steam Cloud, which were taken without the use of Steam's in-game overlay. You just pick pics, select game and SteaScree will do the rest.
The problem: every Steam user has 20 GB of cloud space specifically for a screenshot storing. But not every screenshot can be easily uploaded to the Steam Cloud, since the files should have been created by Steam in-game overlay, thus have a specific filename, reside in specific Steam directories and be registered within a special screenshots.vdf file. Steam fails to upload custom screenshots returning "Steam Cloud may be temporarily unavailable" error. SteaScree resolves this and automates the whole screenshot uploading preparation process.
Sources: Stack Exchange - This article follows the attribution requirements of Stack Exchange and is licensed under CC BY-SA 3.0.
Images: Eren Li, Alexander Suhorucov, RODNAE Productions, Quang Nguyen Vinh