Einen Screenshot von einer laufenden Anwendung (Process) lässt sich sehr leicht  über die Methode CopyFromScreen der Graphics Klasse lösen. Aufwändig ist lediglich das finden der Fensterposition auf dem Desktop.

using System;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;

namespace koesteronline.eu.Drawing
{
  public static class Screenshot
  {
    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
      public int Left;
      public int Top;
      public int Right;
      public int Bottom;

      public int Width { get { return Right - Left; } }
      public int Height { get { return Bottom - Top; } }
    }

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

    public static Bitmap GetBitmapFromProcess(Process process)
    {
      RECT nativRect;
      if (GetWindowRect(process.MainWindowHandle, out nativRect))
      {
        Bitmap bmp = new Bitmap(nativRect.Width, nativRect.Height);
        using (Graphics g = Graphics.FromImage(bmp))
        {
          g.CopyFromScreen(nativRect.Left, nativRect.Top, 0, 0,
            new Size(nativRect.Width, nativRect.Height), CopyPixelOperation.SourceCopy);
        }

        return bmp;
      }

      return null;
    }
  }
}