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

Is it possible to take Steam screenshots without using the in-game overlay? - Person with smartphone and wristwatch in bedroom

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?"

Is it possible to take Steam screenshots without using the in-game overlay? - Black businesswoman taking green apple from colleague at workplace
Is it possible to take Steam screenshots without using the in-game overlay? - Woman in Red Tube Top Taking a Selfie
Is it possible to take Steam screenshots without using the in-game overlay? - Side view of Asian woman sitting and preparing food in cauldron against wall with corn while little daughter surfing smartphone in old wooden barn



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.

screenshot of SteaScree UI with instructions on how to use

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