Captura de pantalla de escritorio y ventana activa en C#

Syed Hassan Sabeeh Kazmi 12 octubre 2023
  1. Capturar pantalla de escritorio en C#
  2. Captura de pantalla de la ventana activa en C#
Captura de pantalla de escritorio y ventana activa en C#

El marco .Net puede capturar las capturas de pantalla en unas pocas líneas de código sin utilizar ningún lenguaje de secuencias de comandos. Hace que el código C# completo sea comprensible para los desarrolladores y fácil de modificar.

Este tutorial describe cómo capturar una sola imagen de la pantalla o ventana activa en C#.

En Windows 10, Windows.Graphics.Capture es un poderoso espacio de nombres que ofrece diferentes API para capturar capturas de pantalla. Las capturas de pantalla del escritorio y de la ventana activa invocan a los desarrolladores para crear interfaces de usuario del sistema seguras para los usuarios finales.

Capturar pantalla de escritorio en C#

En Visual Studio, cree una aplicación C# y asígnele el nombre “Captura de pantalla”. Luego, vaya a la caja de herramientas y agregue un control button1 a Form1.cs [Diseño], y el siguiente código ahora será ejecutable en Form1.cs.

// add the following directories
using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace Screenshot {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    // create a clieck event for the `Screenshot` button
    private void button1_Click(object sender, EventArgs e) {
      Screenshot();
    }
    private void Screenshot() {
      try {
        // set the screenshot resolution based on your monitor's resolution
        Bitmap captureBitmap = new Bitmap(1024, 768, PixelFormat.Format32bppArgb);
        Rectangle captureRectangle = Screen.AllScreens[0].Bounds;
        Graphics captureGraphics = Graphics.FromImage(captureBitmap);
        captureGraphics.CopyFromScreen(captureRectangle.Left, captureRectangle.Top, 0, 0,
                                       captureRectangle.Size);

        // select the save location of the captured screenshot
        captureBitmap.Save(@"E:\Capture.jpg", ImageFormat.Jpeg);

        // show a message to let the user know that a screenshot has been captured
        MessageBox.Show("Screenshot taken! Press `OK` to continue...");
      }

      catch (Exception ex) {
        MessageBox.Show("Error! " + ex.Message);
      }
    }
  }
}

El primer paso para implementar una aplicación de formulario de Windows es agregar la capacidad de captura de pantalla a su proyecto de C#. Abra Package.appxmaanifest en el Explorador de soluciones y seleccione la pestaña Capacidades para comprobar la Captura de gráficos.

Antes de iniciar la interfaz de usuario del sistema, es importante verificar si su aplicación C# es capaz de tomar una captura de pantalla. El dispositivo que no cumple con los requisitos de hardware o el sistema que no da acceso a su aplicación pueden ser las posibles razones de la incapacidad de su aplicación C# para tomar capturas de pantalla.

Utilice el método IsSupported en la clase GraphicsCaptureSession para determinar si su aplicación C# puede capturar capturas de pantalla de escritorio o de ventana activa.

public void OnInitialization() {
  // check if the C# application supports screen capture
  if (!GraphicsCaptureSession.IsSupported()) {
    // this will hide the visibility of the `Screenshot` button if your C# application does not
    // support the screenshot feature
    button1.Visibility = Visibility.Collapsed;
  }
}

Es posible capturar una captura de pantalla del escritorio que contiene todas las ventanas abiertas utilizando el método CopyFromScreen() del objeto Graphics en C#.

using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace Screenshot {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    private void button1_Click(object sender, EventArgs e) {
      CaptureMyScreen();
    }
    private void CaptureMyScreen() {
      Rectangle rect = Screen.GetBounds(Point.Empty);
      using (Bitmap bitmap = new Bitmap(rect.Width, rect.Height)) {
        using (Graphics g = Graphics.FromImage(bitmap)) {
          g.CopyFromScreen(Point.Empty, Point.Empty, rect.Size);
        }
        // select the save location of the captured screenshot
        bitmap.Save(@"E://Capture.png", ImageFormat.Png);

        // show a message to let the user know that a screenshot has been captured
        MessageBox.Show("Screenshot taken! Press `OK` to continue...");
      }
    }
  }
}

Captura de pantalla de la ventana activa en C#

Cuando se ejecutan varias aplicaciones, aparecen muchas ventanas, es importante capturar solo la ventana activa. Una ventana activa es la que actualmente mantiene el foco del teclado.

Mientras que el método CopyFromScreen() del objeto Graphics en C# puede capturar una captura de pantalla del escritorio capturando todas las ventanas abiertas, usar this.Bounds hace el trabajo.

using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace Screenshot {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    private void button1_Click(object sender, EventArgs e) {
      CaptureMyScreen();
    }
    private void CaptureMyScreen() {
      Rectangle rect = this.Bounds;
      using (Bitmap bitmap = new Bitmap(rect.Width, rect.Height)) {
        using (Graphics g = Graphics.FromImage(bitmap)) {
          g.CopyFromScreen(new Point(rect.Left, rect.Top), Point.Empty, rect.Size);
        }
        // select the save location of the captured screenshot
        bitmap.Save(@"E://Capture.png", ImageFormat.Png);

        // show a message to let the user know that a screenshot has been captured
        MessageBox.Show("Screenshot taken! Press `OK` to continue...");
      }
    }
  }
}

Este tutorial cubrió tres formas de capturar capturas de pantalla de escritorio, todas las ventanas abiertas y activas en C#. Es fácil personalizar el código C# anterior según sus gustos.

Sin embargo, es el código C# más optimizado para capturar capturas de pantalla.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub