param([long]$Hwnd, [string]$Out = "w.png") Add-Type -AssemblyName System.Drawing Add-Type @" using System; using System.Runtime.InteropServices; public class P { [DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr h, out RC r); [DllImport("user32.dll")] public static extern bool PrintWindow(IntPtr h, IntPtr hdc, uint f); [DllImport("user32.dll")] public static extern IntPtr GetWindowDC(IntPtr h); [DllImport("user32.dll")] public static extern int ReleaseDC(IntPtr h, IntPtr dc); [DllImport("user32.dll")] public static extern bool BringWindowToTop(IntPtr h); [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr h); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr h, int c); public struct RC { public int L,T,R,B; } } "@ $h = [IntPtr]$Hwnd [void][P]::ShowWindow($h, 9) # SW_RESTORE [void][P]::BringWindowToTop($h) [void][P]::SetForegroundWindow($h) Start-Sleep -Milliseconds 400 $r = New-Object P+RC; [void][P]::GetWindowRect($h, [ref]$r) $w = $r.R - $r.L; $ht = $r.B - $r.T if ($w -le 0 -or $ht -le 0) { Write-Host "bad rect"; exit 1 } $bmp = New-Object System.Drawing.Bitmap $w, $ht $g = [System.Drawing.Graphics]::FromImage($bmp) $hdc = $g.GetHdc() # PW_RENDERFULLCONTENT = 2 (captures DWM-composited content incl. many D3D windows) $ok = [P]::PrintWindow($h, $hdc, 2) $g.ReleaseHdc($hdc) if (-not $ok) { # fallback: screen copy of the (now foreground) window rect $g.CopyFromScreen($r.L, $r.T, 0, 0, (New-Object System.Drawing.Size($w, $ht))) } $bmp.Save($Out, [System.Drawing.Imaging.ImageFormat]::Png) $g.Dispose(); $bmp.Dispose() Write-Host "saved $Out (${w}x${ht}) printwindow=$ok"