C#区域截图——调用API截图

简介: 原文:C#区域截图——调用API截图前言:截图对于一个C++开发者来说无非是小菜一碟,也有朋友使用C#的 Graphics.CopyFromScreen 方法屏幕操作,作为一名整天想着用 C++ 开发游戏的初级 C#.NET 的程序员的我,只是自己研究区域截图,失败 n 多次,最后在半梦半醒中弄出来的简单的Demo,简单的分享一下而已。
原文: C#区域截图——调用API截图

前言:截图对于一个C++开发者来说无非是小菜一碟,也有朋友使用C#的 Graphics.CopyFromScreen 方法屏幕操作,作为一名整天想着用 C++ 开发游戏的初级 C#.NET 的程序员的我,只是自己研究区域截图,失败 n 多次,最后在半梦半醒中弄出来的简单的Demo,简单的分享一下而已。如此的班门弄斧,着实不堪,另外我的 C++ 水平也是处于入门水准,如果该博客有什么问题,请各位朋友留言指正,谢谢关照!


附件及其他:

C#的 Graphics.CopyFromScreen 方法   https://msdn.microsoft.com/zh-cn/library/fw1kt6f9.aspx

附件:http://files.cnblogs.com/files/herbertchina/GetFormDemo.zip


本文Demo:(VS2010环境)

本文使用的图片素材:

image


本文主题:

从窗体的图片中截取需要的部分,本例是验证码区域。


正文:

先贴出主要代码

        /// <summary>
        /// 指定窗口区域截图
         /// </summary>
        /// <param name="handle">窗口句柄. (在windows应用程序中, 从Handle属性获得)</param>
        /// <param name="rect">窗口中的一个区域</param>
        /// <returns></returns>
        public  Bitmap CaptureWindow(IntPtr hWnd,RECT rect)
        {
            // 获取设备上下文环境句柄
              IntPtr hscrdc = GetWindowDC(hWnd);

            // 创建一个与指定设备兼容的内存设备上下文环境(DC)
              IntPtr hmemdc = CreateCompatibleDC(hscrdc);
            IntPtr myMemdc = CreateCompatibleDC(hscrdc);

            // 返回指定窗体的矩形尺寸
              RECT rect1;
            GetWindowRect(hWnd, out rect1);

            // 返回指定设备环境句柄对应的位图区域句柄
              IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, rect1.Right - rect1.Left, rect1.Bottom - rect1.Top);
            IntPtr myBitmap = CreateCompatibleBitmap(hscrdc, rect.Right - rect.Left, rect.Bottom - rect.Top);

            //把位图选进内存DC 
            // IntPtr OldBitmap = (IntPtr)SelectObject(hmemdc, hbitmap);
            SelectObject(hmemdc, hbitmap);
            SelectObject(myMemdc, myBitmap);

            /////////////////////////////////////////////////////////////////////////////
            //
            // 下面开始所谓的作画过程,此过程可以用的方法很多,看你怎么调用 API 了
              //
            /////////////////////////////////////////////////////////////////////////////

            // 直接打印窗体到画布
              PrintWindow(hWnd, hmemdc, 0);

            // IntPtr hw = GetDesktopWindow();
            // IntPtr hmemdcClone = GetWindowDC(myBitmap);

            BitBlt(myMemdc, 0, 0, rect.Right - rect.Left, rect.Bottom - rect.Top, hmemdc, rect.Left, rect.Top, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt);
            //SelectObject(myMemdc, myBitmap);

            Bitmap bmp = Bitmap.FromHbitmap(myBitmap);
            DeleteDC(hscrdc);
            DeleteDC(hmemdc);
            DeleteDC(myMemdc);
            return bmp;
        }

讲解吧:

原理步骤:
1、通过窗体 handle 创建设备上下文环境
2、根据上下文环境句柄建立对应的与设备兼容的内存设备上下文环境(理解成一块画板,内存上的)
3、通过窗体句柄得到长宽,通过CreateCompatibleBitmap得到窗体对应的设备环境句柄对应的位图区域(理解成自然界的一个美丽的景色)
4、通过 SelectObject 指向性,把 3 中的位图区域句柄对应到 2 中的内存设备上下文中(理解成,我需要画这大自然的美丽景色,我需要有相应的画布,这里就是在画板上固定画布)
5、绘图,包括各种 API 绘图或获取图形
6、此处很重要,因为我们不是要过去框架的整体图形,我们要的是局部的,于是,我们可以通过 1 、2 、3 、4 的步骤,再建设一块画布(第三步有一点区别,就是长宽)
7、通过 BitBlt 方法把之前画好的画的一个区域复制到我们新建的画板上, BitBlt 的功能是“对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境”
8、然后就简单了,Bitmap bmp = Bitmap.FromHbitmap(myBitmap);把我们复制出来的第二块画板上的画生成位图图像
9、再进行什么操作就随你了
10、最后,最后,最最重要的是……不要忘了使用 DeleteDC 函数清除第 1 、 2 中建的上下文环境,因为这是 API,没有Java的自动清理机制


再者:

再者,哥们我是初学者,文章仅供参考,有什么问题可以百度、google,然后就是,我上面说的一定有问题,请看明白的朋友指正留言,帮助下小友学习一二!谢谢!

目录
相关文章
|
4月前
|
设计模式 开发框架 安全
C# 一分钟浅谈:GraphQL API 与 C#
本文介绍了 GraphQL API 的基本概念及其优势,并通过 C# 实现了一个简单的 GraphQL 服务。GraphQL 是一种高效的 API 查询语言,允许客户端精确请求所需数据,减少不必要的数据传输。文章详细讲解了如何使用 `GraphQL.NET` 库在 C# 中创建和配置 GraphQL 服务,并提供了常见问题的解决方案和代码示例。
105 4
|
5月前
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
162 7
|
5月前
|
API C#
异步轮询 Web API 的实现与 C# 示例
异步轮询 Web API 的实现与 C# 示例
127 0
|
7月前
|
开发框架 人工智能 自然语言处理
基于ChatGPT的API的C#接入研究
基于ChatGPT的API的C#接入研究
|
10月前
|
JSON 文字识别 算法
C# 通过阿里云 API 实现企业营业执照OCR识别
C# 通过阿里云 API 实现企业营业执照OCR识别
|
10月前
|
JSON API C#
C# 通过阿里云 API 实现企业工商数据查询
C# 通过阿里云 API 实现企业工商数据查询
|
10月前
|
API C# 图形学
【Unity 3D】常见API的讲解以及在C#脚本中的执行(附源码)
【Unity 3D】常见API的讲解以及在C#脚本中的执行(附源码)
220 1
|
10月前
|
监控 安全 API
深入探讨API安全性与C#实例演示
在本篇文章中,我们将深入研究 API 的安全性,并通过使用 C# 的实际示例探索一些基本机制。
130 0
|
10月前
|
文字识别 JavaScript API
Vue实现:Ctrl+V粘贴文字图片截图,调用第三方API文字识别OCR内容并进行内容分割识别填充。
Vue实现:Ctrl+V粘贴文字图片截图,调用第三方API文字识别OCR内容并进行内容分割识别填充。
|
10月前
|
API Python Windows
python3应用windows api对后台程序窗口及桌面截图并保存的方法
python3应用windows api对后台程序窗口及桌面截图并保存的方法
626 1