整理的C#屏幕截图,控件截图程序
代码基本从网上搜集而来,整理成以下文件:
包括屏幕截图(和屏幕上看到的一致);
以及控件截图(只要该控件在本窗口内显示完全且不被其他控件遮挡就可正确截图)
- 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#屏幕截图,控件截图程序的更多相关文章
- DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表
原文:DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助 ...
- ActiveX 控件导入程序
ActiveX 控件导入程序将 ActiveX 控件的 COM 类型库中的类型定义转换为 Windows 窗体控件. http://msdn.microsoft.com/zh-cn/library/8 ...
- 使用SplashScreenManager控件定制程序加载页面
需要devexpress版本在12.0及以上才支持 https://www.cnblogs.com/wuhuacong/p/6112461.html 在DevExpress程序中使用SplashScr ...
- C# WinForm 技巧:控件截图
Point screenPoint = 控件.PointToScreen(new Point()); Rectangle rect = new Rectangle(screenPoint, chart ...
- 【iOS】控件截图、MP4格式视频流和m3u8格式视频流截取某一帧功能的实现
最近开发遇到一个点击按钮实现直播视频流截屏的功能,去网上查了一下资料,总结了一下iOS中截屏相关的知识,然后自己做了个demo. demo主要实现了3种截屏方法,分别对应三种不同的应用场景. 1.im ...
- Winform DevExpress控件库(二) 使用SplashScreenManager控件定制程序加载页面
SplashScreenManager控件:主要作用是显示在进行耗时操作时的等待界面: 位于 工具箱 -> Navigation & Layout(导航栏与布局类控件) 目录下: 在工具 ...
- WPF控件截图
//截图 RenderTargetBitmap RenderVisaulToBitmap(Visual vsual, int width, int height) { ...
- WPF 控件截图位置不正确的问题
用WPF的RenderTargetBitmap可以截取控件内容到一张图片上,但是实际使用的时候经常出现截取的位置不正确的问题.今天是第二次解决这个问题,所以记录下,免得再忘了. RenderTarge ...
- Delphi实现拍照控件的程序代码
完整的delphi拍照控件代码,实现利用摄像头进行拍照的功能.需要TVideoCap控件支持. procedure Tfrm1.Button2Click(Sender: TObject); Var j ...
随机推荐
- C#:使用UPnP来穿透NAT使内网接口对外网可见
在写完Object 672后,软件的一个致命问题暴露出来,如果服务器和客户端都在内网环境下,即双方都通过NAT来接触外网,那么此时客户端是无法直接和服务器交流的. 解决方案可以是: 1:把服务器部署在 ...
- C#中将dateTimePicker初始值设置为空
最近在做一个小项目,有一个功能是根据用户选择条件查询数据,要求时间控件的默认值为空,只有当用户修改了时间,才根据时间查询.简单的说,就是默认或者点击清空按钮的情况下,时间控件dateTimePicke ...
- ORACLE初始化参数文件概述
ORACLE初始化参数文件概述 在9i之前,参数文件只有一种,它是文本格式的,称为pfile,在9i及以后的版本中,新增了服务器参数文件,称为spfile,它是二进制格式的.这两种参数文件都是用来存储 ...
- 超时 CS-8610 中性笔
超时 CS-8610 中性笔 最初觉得这款笔很简单,而且还认为有点丑,因为笔头比较短. 比较特别提这款中性笔比一般的中性笔要粗一点. 使用后才发现比其它的中性笔好用,因为笔杆粗,手感好,笔杆上并没有特 ...
- 试用 Eagle 9.1
试用 Eagle 9.1 有推挤功能 原理图可以设置组装变体. 输出的 CAM 可以自定义,没有 Protel 那么死板. 保存的文件是 xml 文件,可以自由解析.
- inotify 同步脚本
#!/bin/bash path1=/home/htoa/tomcat/webapps/ROOT/htoa/ ip=192.168.30.13 /usr/bin/inotifywait -mrq -- ...
- es5中foreach的用法
HTML代码: <p id="result"></p> JS代码: var eleResult = document.getElementById(&quo ...
- 蓝桥杯 Beaver's Calculator
问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0".它非常特别,并且被计划使用在各种各样 ...
- npm、nvm、nrm
随着前端技术的不断更新和发展,nodejs也越来越流行,作为一个web developer,要安装的依赖包.工具库也越来越多,所以npm几乎是所有前端开发者所必须要用到的,我在工作中曾经遇到过这样的问 ...
- Laravel 在 with 查询中只查询个别字段
在使用 Laravel 的关联查询中,我们经常使用 with 方法来避免 N+1 查询,但是 with 会将目标关联的所有字段全部查询出来,对于有强迫症的我们来说,当然是不允许的. 这时候我们可以使用 ...