[Snippet] Capture Window Screenshot
Here's my method of taking a screenshot of a window. Not the most efficient way to do it, but hey, it works.
Required namespaces:
Code:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;
Required external methods:
Code:
[DllImport("User32.dll")]
public static extern Int32 SetForegroundWindow(int hWnd);
[DllImport("user32.dll")]
static extern bool GetWindowRect(int hwnd, out Rectangle lpRect);
Code:
Code:
Image CaptureWindowScreenshot(string processName, int processInstanceIndex)
{
int processMainWindowHandle = Process.GetProcessesByName(processName)[processInstanceIndex].MainWindowHandle.ToInt32();
SetForegroundWindow(processMainWindowHandle);
Thread.Sleep(500);
Rectangle rectangle = new Rectangle();
GetWindowRect(processMainWindowHandle, out rectangle);
Image windowScreenshot = (Image)new Bitmap(rectangle.Width, rectangle.Height);
using (Graphics graphics = Graphics.FromImage(windowScreenshot))
{
//graphics.CompositingMode = CompositingMode.SourceCopy;
//graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
//graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
//graphics.CompositingQuality = CompositingQuality.HighQuality;
//graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.CopyFromScreen(rectangle.Location, rectangle.Location, rectangle.Size);
}
return windowScreenshot;
}
Usage:
Code:
Image windowScreenshot;
try
{
windowScreenshot = CaptureWindowScreenshot("processName", 0);
windowScreenshot.Save("windowScreenshot.png");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}