代码基本从网上搜集而来,整理成以下文件:
包括屏幕截图(和屏幕上看到的一致);
以及控件截图(只要该控件在本窗口内显示完全且不被其他控件遮挡就可正确截图)
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LC
{
class ScreenCapture
{
#region 抓取屏幕
/// <summary>
/// 抓取屏幕(层叠的窗口)
/// </summary>
/// <param name="x">左上角的横坐标</param>
/// <param name="y">左上角的纵坐标</param>
/// <param name="width">抓取宽度</param>
/// <param name="height">抓取高度</param>
/// <returns></returns>
public static Bitmap captureScreen(int x, int y, int width, int height)
{
Bitmap bmp = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(bmp))
{
g.CopyFromScreen(new Point(x, y), new Point(0, 0), bmp.Size);
g.Dispose();
}
//bit.Save(@"capture2.png");
return bmp;
}
/// <summary>
/// 抓取整个屏幕
/// </summary>
/// <returns></returns>
public static Bitmap captureScreen()
{
Size screenSize = Screen.PrimaryScreen.Bounds.Size;
return captureScreen(0,0,screenSize.Width,screenSize.Height);
}
#endregion
#region 使用BitBlt方法抓取控件,无论控件是否被遮挡
/// <summary>
/// 控件(窗口)的截图,控件被其他窗口(而非本窗口内控件)遮挡时也可以正确截图,使用BitBlt方法
/// </summary>
/// <param name="control">需要被截图的控件</param>
/// <returns>该控件的截图,控件被遮挡时也可以正确截图</returns>
public static Bitmap captureControl(Control control)
{
//调用API截屏
IntPtr hSrce = GetWindowDC(control.Handle);
IntPtr hDest = CreateCompatibleDC(hSrce);
IntPtr hBmp = CreateCompatibleBitmap(hSrce, control.Width, control.Height);
IntPtr hOldBmp = SelectObject(hDest, hBmp);
if (BitBlt(hDest, 0, 0, control.Width, control.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt))
{
Bitmap bmp = Image.FromHbitmap(hBmp);
SelectObject(hDest, hOldBmp);
DeleteObject(hBmp);
DeleteDC(hDest);
ReleaseDC(control.Handle, hSrce);
// bmp.Save(@"a.png");
// bmp.Dispose();
return bmp;
}
return null;
}
// /// <summary>
// /// 有问题!!!!!用户区域坐标不对啊
// /// 控件(窗口)的用户区域截图,控件被其他窗口(而非本窗口内控件)遮挡时也可以正确截图,使用BitBlt方法
// /// </summary>
// /// <param name="control">需要被截图的控件</param>
// /// <returns>控件(窗口)的用户区域截图</returns>
// public static Bitmap captureClientArea(Control control)
// {
//
// Size sz = control.Size;
// Rectangle rect = control.ClientRectangle;
//
//
// //调用API截屏
// IntPtr hSrce = GetWindowDC(control.Handle);
// IntPtr hDest = CreateCompatibleDC(hSrce);
// IntPtr hBmp = CreateCompatibleBitmap(hSrce, rect.Width, rect.Height);
// IntPtr hOldBmp = SelectObject(hDest, hBmp);
// if (BitBlt(hDest, 0, 0, rect.Width, rect.Height, hSrce, rect.X, rect.Y, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt))
// {
// Bitmap bmp = Image.FromHbitmap(hBmp);
// SelectObject(hDest, hOldBmp);
// DeleteObject(hBmp);
// DeleteDC(hDest);
// ReleaseDC(control.Handle, hSrce);
// // bmp.Save(@"a.png");
// // bmp.Dispose();
// return bmp;
// }
// return null;
//
// }
#endregion
#region 使用PrintWindow方法抓取窗口,无论控件是否被遮挡
/// <summary>
/// 窗口的截图,窗口被遮挡时也可以正确截图,使用PrintWindow方法
/// </summary>
/// <param name="control">需要被截图的窗口</param>
/// <returns>窗口的截图,控件被遮挡时也可以正确截图</returns>
public static Bitmap captureWindowUsingPrintWindow(Form form)
{
return GetWindow(form.Handle);
}
private static Bitmap GetWindow(IntPtr hWnd)
{
IntPtr hscrdc = GetWindowDC(hWnd);
Control control = Control.FromHandle(hWnd);
IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, control.Width, control.Height);
IntPtr hmemdc = CreateCompatibleDC(hscrdc);
SelectObject(hmemdc, hbitmap);
PrintWindow(hWnd, hmemdc, 0);
Bitmap bmp = Bitmap.FromHbitmap(hbitmap);
DeleteDC(hscrdc);//删除用过的对象
DeleteDC(hmemdc);//删除用过的对象
return bmp;
}
#endregion
#region DLL calls
[DllImport("gdi32.dll")]
static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int
wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteDC(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteObject(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll")]
static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr ptr);
[DllImport("user32.dll")]
public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, UInt32 nFlags);
[DllImport("user32.dll")]
static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);
#endregion
}
}
分享到:
相关推荐
在C#开发中,控件是用户界面的核心组成部分,它们用于构建功能丰富的应用程序。本文将详细总结C#中常用的控件及其设计原理、属性和常用事件。 #### 控件基础概念 在.NET Framework中,控件(Control)是一种图形...
C#控件设计是开发Windows桌面应用程序的基础,它涉及到用户界面的设计和交互。在C#中,窗体(Form)是构建用户界面的基本组件,它提供了承载其他控件的平台。以下是一些C#控件及其常用设计的关键知识点: 1. **窗体...
【C#控件大全】是针对C#编程语言中用户界面设计的重要组成部分,这些控件是构建图形用户界面(GUI)的基础。对于C#初学者来说,了解并掌握这些控件的功能和用法至关重要。以下是对C#窗体及其常用属性的详细说明: 1...
标题"**C# Winform控件随窗体缩放**"正是关于这个主题,描述中提到的是一种实现方式,通过整理博客上的资料来帮助初学者理解如何实现这一功能。 控件自动缩放是Windows应用程序设计中的一个重要概念,它涉及到...
根据给定的文件信息,以下是对C#控件及其常用属性的详细整理和解析: ### 控件基础属性 #### Name属性 - **功能**: 定义控件的名称,用于在代码中引用该控件。 - **作用**: 唯一标识控件,方便在编程时访问。 ###...
### C#控件及其常用设计知识点详解 #### 一、窗体基础属性解析 在C#编程中,窗体是用户界面的基础组成部分,通过合理的设置窗体的各种属性,可以实现丰富的用户交互体验。以下是对部分关键窗体属性的详细介绍: 1...
### C# 控件一览表与常用设计整理 #### 一、窗体 窗体是C#应用程序中的基本组件之一,它提供了用户与程序之间交互的主要界面。了解并掌握窗体的各种属性对于创建功能完善且用户体验良好的应用至关重要。 ##### 1....
在标题和描述中提到的“C#控件一览表”是一个详细列出C#常用控件及设计整理的文档,包含了各种控件的属性、方法和事件。这个一览表为开发者提供了快速查询控件相关特性的途径,能够大大提高开发效率。由于文档内容...
本资源包是一个针对C# .NET平台的第三方控件集合,由个人精心整理,涵盖了多种常见的UI控件,能够帮助开发者快速构建功能丰富的桌面和Web应用程序。 1. Infragistics控件库:Infragistics是一家知名的软件公司,...
### C#经典特效代码470例概览与关键技术解析 #### 一、窗体与界面设计 在C#开发中,窗体与界面的设计是非常重要的一个方面,它直接影响到用户的体验以及软件的整体美观度。本节将详细介绍《C#经典特效代码470例》...
第1章 认识C#及开发环境 1.1 C#概述 2 1.1.1 C#发展历程 2 1.1.2 C#语言编程环境 2 1.2 .NET Framework 2.0简介 2 1.2.1 什么是.NET Framework 2.0 2 1.2.2 .NET Framework 2.0特性 3 1.3 安装集成...
- 图标排序:利用`System.Windows.Forms.Screen`获取屏幕分辨率,配合`System.Windows.Forms.Cursor.Position`定位鼠标位置,实现自动整理桌面图标。 - 图标隐藏/显示:读取并修改注册表中的相关键值,控制桌面...
第1章 认识C#及开发环境 1.1 C#概述 1.1.1 C#发展历程 1.1.2 C#语言编程环境 1.2.NETFramework2.0简介 1.2.1 什么是.NETFramework2.0 1.2.2.NETFramework2.0特性 1.3 安装集成开发环境VisualStudio2005 1.3.1 安装...