Захват экрана за окном в C#: изучено несколько методов

Захват экрана за окном может оказаться полезной функцией в различных сценариях, например при создании обучающих программ, записи игрового процесса или автоматизации задач, требующих взаимодействия с определенными окнами. В этой статье блога мы рассмотрим несколько методов C# для захвата экрана за окном, а также примеры кода.

Метод 1. Использование функций Windows API (PrintWindow)

Первый метод предполагает использование функций Windows API, в частности функции PrintWindow. Этот метод захватывает содержимое окна, включая его основной экран. Вот пример:

using System;
using System.Drawing;
using System.Runtime.InteropServices;
public class WindowCapture
{
    [DllImport("user32.dll")]
    public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, int nFlags);
    public static Bitmap CaptureWindow(IntPtr hwnd)
    {
        Rectangle bounds;
        using (var graphics = Graphics.FromHwnd(hwnd))
        {
            bounds = Rectangle.Round(graphics.VisibleClipBounds);
        }
        var bitmap = new Bitmap(bounds.Width, bounds.Height);
        using (var graphics = Graphics.FromImage(bitmap))
        {
            var hdcBitmap = graphics.GetHdc();
            PrintWindow(hwnd, hdcBitmap, 0);
            graphics.ReleaseHdc(hdcBitmap);
        }
        return bitmap;
    }
}

Метод 2: использование форм Windows (CopyFromScreen)

Второй метод предполагает использование метода CopyFromScreen, предоставляемого пространством имен System.Windows.Forms. Этот метод захватывает указанную область экрана, позволяя нам извлечь содержимое за определенным окном. Вот пример:

using System;
using System.Drawing;
using System.Windows.Forms;
public class WindowCapture
{
    public static Bitmap CaptureWindow(IntPtr hwnd)
    {
        var window = Control.FromHandle(hwnd);
        var bounds = window.Bounds;
        var bitmap = new Bitmap(bounds.Width, bounds.Height);
        using (var graphics = Graphics.FromImage(bitmap))
        {
            graphics.CopyFromScreen(bounds.Location, Point.Empty, bounds.Size);
        }
        return bitmap;
    }
}

Способ 3. Использование сторонних библиотек (SnippingTool)

Другой подход — использовать сторонние библиотеки, которые предоставляют возможности захвата экрана. Одной из таких библиотек является SnippingTool, которая предлагает простой и удобный способ захвата экрана за окнами. Вот пример использования библиотеки SnippingTool:

using SnippingTool;
public class WindowCapture
{
    public static Bitmap CaptureWindow(IntPtr hwnd)
    {
        var snippingTool = new SnippingTool.SnippingTool();
        return snippingTool.Capture(hwnd);
    }
}

В этой статье блога мы рассмотрели три различных метода захвата экрана за окном в C#. Первый метод включал использование функций Windows API, таких как PrintWindow, второй метод использовал метод CopyFromScreenиз пространства имен System.Windows.Formsи третий метод продемонстрировал использование сторонней библиотеки под названием SnippingTool. В зависимости от ваших конкретных требований вы можете выбрать наиболее подходящий метод для вашего приложения.

Используя эти методы, вы можете улучшить свои приложения C# с помощью функций захвата экрана, открывая возможности для различных творческих и практических вариантов использования.