Снимки экрана различными способами с помощью C # и Winforms

Чтобы сообщить об ошибках, приложение предназначено только для того, чтобы сделать снимок экрана с окном и т. Д. Как бы то ни было, изображение говорит более 1000 слов.

В этой статье вы узнаете, как сделать снимок экрана монитора или только указанного окна winform.

Мы предлагаем 2 различных метода для достижения каждого типа скриншота. Если вы хотите использовать те, которые используют класс ScreenCapture, вам понадобится следующий класс в вашем проекте, код следующий: не забудьте изменить пространство имен в соответствии с один из ваших проектов:

Замечания : вам не нужен этот класс, если вы используете методы, которые не требуют ScreenCapture, так как вы можете использовать второй вариант, который использует только CopyFromScreen метод.

using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
namespace ChangeThisNamespace
{
///
/// Provides functions to capture the entire screen, or a particular window, and save it to a file.
///
public class ScreenCapture
{
///
/// Creates an Image object containing a screen shot of the entire desktop
///
///
public Image CaptureScreen()
{
return CaptureWindow(User32.GetDesktopWindow());
}
///
/// Creates an Image object containing a screen shot of a specific window
///
/// The handle to the window. (In windows forms, this is obtained by the Handle property)
///
public Image CaptureWindow(IntPtr handle)
{
// get te hDC of the target window
IntPtr hdcSrc = User32.GetWindowDC(handle);
// get the size
User32.RECT windowRect = new User32.RECT();
User32.GetWindowRect(handle, ref windowRect);
int width = windowRect.right - windowRect.left;
int height = windowRect.bottom - windowRect.top;
// create a device context we can copy to
IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
// create a bitmap we can copy it to,
// using GetDeviceCaps to get the width/height
IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
// select the bitmap object
IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
// bitblt over
GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
// restore selection
GDI32.SelectObject(hdcDest, hOld);
// clean up
GDI32.DeleteDC(hdcDest);
User32.ReleaseDC(handle, hdcSrc);
// get a .NET image object for it
Image img = Image.FromHbitmap(hBitmap);
// free up the Bitmap object
GDI32.DeleteObject(hBitmap);
return img;
}
///
/// Captures a screen shot of a specific window, and saves it to a file
///
///
///
///
public void CaptureWindowToFile(IntPtr handle, string filename, ImageFormat format)
{
Image img = CaptureWindow(handle);
img.Save(filename, format);
}
///
/// Captures a screen shot of the entire desktop, and saves it to a file
///
///
///
public void CaptureScreenToFile(string filename, ImageFormat format)
{
Image img = CaptureScreen();
img.Save(filename, format);
}
///
/// Helper class containing Gdi32 API functions
///
private class GDI32
{
public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter
[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest,
int nWidth, int nHeight, IntPtr hObjectSource,
int nXSrc, int nYSrc, int dwRop);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth,
int nHeight);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern bool DeleteDC(IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
}
///
/// Helper class containing User32 API functions
///
private class User32
{
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("user32.dll")]
public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
}
}
}

Скриншот активного окна winform

Есть 2 способа сделать скриншот fullscren, используя самореализуемые скриншоты с помощью окна «Рисование окон» или используя ранее упомянутый класс.

Чтобы сделать снимок экрана только из активного окна, мы будем использовать следующий класс, который позволяет делать снимки экрана другого типа.

Во-первых, не забудьте добавить следующие операторы использования в начало вашего класса (где вы собираетесь использовать методы) для доступа к необходимым методам:

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

Теперь, чтобы сделать скриншот активного окна, используйте следующий метод в вашем основном классе:

///
/// Creates a screenshot of the active winform window.
/// It uses the ScreenCapture class.
///
///
///
///
private void WindowScreenshot(String filepath, String filename, ImageFormat format)
{
ScreenCapture sc = new ScreenCapture();
string fullpath = filepath + "\\" + filename;
sc.CaptureWindowToFile(this.Handle, fullpath, format);
}
// Use like :
WindowScreenshot(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "window_screenshot.jpg", ImageFormat.Jpeg);

Теперь другой способ — использовать метод CopyFromScreen из класса Graphics .NET.

Используйте следующий метод, чтобы сделать снимок экрана из активного окна без какого-либо класса:

///
/// Take the screenshot of the active window using the CopyFromScreen method relative to the bounds of the form.
///
///
///
///
private void WindowScreenshotWithoutClass(String filepath, String filename, ImageFormat format)
{
Rectangle bounds = this.Bounds;
using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
}
string fullpath = filepath + "\\" + filename;
bitmap.Save(fullpath,format);
}
}
// Use it like :
WindowScreenshotWithoutClass(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "window_screen_noclass.jpg", ImageFormat.Jpeg);

Полноэкранный скриншот

Есть 2 способа сделать скриншот fullscren, используя самореализуемые скриншоты с помощью окна «Рисование окон» или используя ранее упомянутый класс.

Первый способ сделать полноэкранный скриншот, мы будем использовать CopyFromScreen метод из Graphics класс .NET.

Во-первых, не забудьте добавить следующие операторы использования в начало вашего класса для доступа к необходимым методам:

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

Теперь, чтобы сделать снимок экрана и сохранить его в указанном каталоге, используйте следующий метод:

///
/// Takes a fullscreen screenshot of the monitor and saves the specified file in a directory with custom name.
/// It expects the Format of the file.
///
///
///
///
private void FullScreenshot(String filepath,String filename,ImageFormat format)
{
Rectangle bounds = Screen.GetBounds(Point.Empty);
using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
}
string fullpath = filepath + "\\" + filename;
bitmap.Save(fullpath, format);
}
}
// Use it as
FullScreenshot(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "screenshot.jpg", ImageFormat.Jpeg);

И чтобы создать скриншот с помощью класса ScreenCapture, используйте следующий метод:

///
///  Creates a screenshot using the ScreenCapture class.
///
///
///
///
private void FullScreenshotWithClass(String filepath, String filename, ImageFormat format)
{
ScreenCapture sc = new ScreenCapture();
Image img = sc.CaptureScreen();
string fullpath = filepath + "\\" + filename;
img.Save(fullpath, format);
}
// And use it like
FullScreenshotWithClass(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "screenshotfull_class.jpg", ImageFormat.Jpeg);

Больше информации

  • Помните, что вы можете изменить формат вашего изображения, изменив расширение и тип ImageFormat. Этот класс поддерживает следующие форматы:
    • ImageFormat.Jpeg
    • ImageFormat.Gif
    • ImageFormat.Tiff
    • ImageFormat.Icon
    • ImageFormat.MemoryBmp
    • ImageFormat.Bmp
    • ImageFormat.Exif

Повеселись .

Ссылка на основную публикацию
Adblock
detector