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

Here's a thread from the steam forums which gives a very roundabout way of taking screenshots without using the steam overlay (I've duplicated what's said there with a few edits as Jonathan Drapeau recommended). Some games just don't work with it. Basically, you have to manually create a remote folder under the appid of the particular game and store screenshots in there.

  1. First find the appid of the game. An easy way of doing this is searching for the game in the steam store on store.steampowered.com and noting the number in the URL. Here's an example using Teslagrad
  2. Take your screenshots using ALT-PrtScrn (windowed) or PrtScrn (full desktop) or use Camtasia, FRAPS, etc.
  3. Close Steam.
  4. Create the App ID folder in the following file path: Program Files\Steam\userdata\X(number may vary)\760\remote
  5. Create a "screenshots" folder inside 249590 (that's the number from the example for Teslagrad yours will vary). Inside screenshots create a folder called "thumbnails". So now you have: Program Files\Steam\userdata\X\760\remote\249590\screenshots & Program Files\Steam\userdata\X\760\remote\249590\screenshots\thumbnails
  6. Each screenshot is named with the date and a number. Structure is year-month-date: 2015-XX-XX_00001.jpg.
  7. Create the thumbnails for your screens. Thumbnails resolution size is 200x150. The max horizontal resolution is 200 and the max vertical resolutiono is 150. You can scale either way within those bounds as needed (eg. 200x94 or 180x150). Screenshots need a thumbnail. They need to be named with the same file name as the full size screenshot.
  8. Open Steam again. Let it synchronise and scan your files. Open your screenshots folder. Voilá! The newly taken screenshots will be there, ready to be uploaded to the cloud so you can carry them everywhere!

Good luck! This steps will be useful for other games that fail to take screenshots or have problems too.


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.

Tags:

Steam