代码基本从网上搜集而来,整理成以下文件:
包括屏幕截图(和屏幕上看到的一致);
以及控件截图(只要该控件在本窗口内显示完全且不被其他控件遮挡就可正确截图)
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# 屏幕截图 c# 屏幕截图 c# 屏幕截图 c# 屏幕截图 c# 屏幕截图 c# 屏幕截图 c# 屏幕截图 c# 屏幕截图 c# 屏幕截图 c# 屏幕截图 c# 屏幕截图 c# 屏幕截图 c# 屏幕截图
C#屏幕截图源码 C# 屏幕截图源码C# 屏幕截图源码C# 屏幕截图源码C# 屏幕截图源码C# 屏幕截图源码C# 屏幕截图源码
C# 实现完整功能的截图控件,便于vs调用第三方控件
C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮...
C#屏幕截图完整源码【201903】
C#用户自定义控件C#用户自定义控件C#用户自定义控件C#用户自定义控件
c#常用标准控件c#常用标准控件c#常用标准控件c#常用标准控件
用c#编写的示例程序,可以单击或双击后拖动控件到窗体任何位置,鼠标移动到控件边沿可以改变光标形状,按下鼠标左键后拖动可以改变控件大小,改变主窗体大小控件大小跟随改变
C#实现截屏。vs2015C#实现简单截屏功能,供大家参考学习
C# 自定义用户控件(PictureBox)
C#截图(截屏)源代码及使用例子(仿QQ截图) 基于CS程序员之窗CSharpWin截图源码,进行了简单修改。 1、截图时添加遮罩层 2、响应键盘事件ESC 3、默认鼠标样式 4、保存默认文件名 5、截图时立即执行OnPaint函数
c#截屏程序,用控件的方法实现的!供大家学习参考使用!也为自己混个积分!
C# 从内存中获取webbrowser控件截图,可以后台或者隐藏窗体截图 C# 从内存中获取webbrowser控件截图,可以后台或者隐藏窗体截图
C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习
基于c#自定义封装控件(IP地址填写控件)
1、C# 实现完整功能的截图控件(1)-实现绘图工具栏控件 2、C# 实现完整功能的截图控件(2)-实现颜色和字体选择控件 3、C# 实现完整功能的截图控件(3)-实现漂亮的快捷菜单 4、C# 实现完整功能的截图控件(4)-完整版
C#中的控件拖动程序源代码,实现C# winform中的控件自定义拖拽。
C# 表达式绘图控件C# 表达式绘图控件C# 表达式绘图控件C# 表达式绘图控件C# 表达式绘图控件C# 表达式绘图控件
C#自动截图程序,自动截图,随意更改保存路径及截图时间,开机自启动。
c#显示时间控件