C# 之 鼠标点击进程 —— 截取图片

此文部分知识点相关文章:

  • C# 之 Win32 Api使用
  • C# 之 MouseHook(鼠标钩子)使用

此文在使用 MouseHook的基础上加了一个鼠标点击程序 获取截图的功能,所有要先看看上面的两篇文章比较好 . . .

话不多说先来看一下程序的效果如何:

运行程序,点击 Vs 自动获取截图,并在画图软件中显示出来,也可以到当前目录中查看图片 . . .

.

要想写出截图的代码,我们需要学习九个 Win32 Api,他们分别是:
C# 之 鼠标点击进程 —— 截取图片_第1张图片

其中有两两Api 是对应的,比如获取句柄 对应 释放句柄,所以我们还是比较容易理解这九个 Api 的使用 . . .

.

Win32 Api 的描述与功能

1. PrintWindow:C# 之 鼠标点击进程 —— 截取图片_第2张图片 2. SelectObject:C# 之 鼠标点击进程 —— 截取图片_第3张图片 3. CreateCompatibleDC:C# 之 鼠标点击进程 —— 截取图片_第4张图片 4. DeleteDC:C# 之 鼠标点击进程 —— 截取图片_第5张图片5. CreateCompatibleBitmap:C# 之 鼠标点击进程 —— 截取图片_第6张图片 6. DeleteObject:C# 之 鼠标点击进程 —— 截取图片_第7张图片 7. GetWindowRect:C# 之 鼠标点击进程 —— 截取图片_第8张图片 8. GetWindowDC:C# 之 鼠标点击进程 —— 截取图片_第9张图片 9. ReleaseDC:C# 之 鼠标点击进程 —— 截取图片_第10张图片


程序实现

  1. 首先,我们一个名为 CaptrueImage 的类,他有一个方法用于返回截取的 Bitmap(位图)
    C# 之 鼠标点击进程 —— 截取图片_第11张图片

  2. 在这个类中 导入 Win32 Api:
    C# 之 鼠标点击进程 —— 截取图片_第12张图片

.

. 实现 Captuer 方法,返回位图:

  1. 判断是否有进程存在,没有则返回方法:
if (process == null) return null;
  1. 获取设备上下文:
    C# 之 鼠标点击进程 —— 截取图片_第13张图片

  2. 获取指定窗口边界的尺寸:GetWindowRect
    C# 之 鼠标点击进程 —— 截取图片_第14张图片

  3. 计算窗口大小:
    C# 之 鼠标点击进程 —— 截取图片_第15张图片

  4. 创建一个设备上下文相关的位图,CreateCompatibleBitmap -> DeleteObject
    C# 之 鼠标点击进程 —— 截取图片_第16张图片

  5. 创建一个内存上下文兼容的句柄,CreateCompatibleDC -> DeleteDC
    C# 之 鼠标点击进程 —— 截取图片_第17张图片

  6. 选择一个设备上下文对象:SelectObject
    C# 之 鼠标点击进程 —— 截取图片_第18张图片

  7. 拷贝窗口到设备上下文,PrintWindow
    C# 之 鼠标点击进程 —— 截取图片_第19张图片

  8. 从位图句柄中创建 Bitmap:
    在这里插入图片描述

  9. 清理垃圾,并返回位图:
    C# 之 鼠标点击进程 —— 截取图片_第20张图片

.

. 修改鼠标钩子左键按下操作:

C# 之 鼠标点击进程 —— 截取图片_第21张图片

上面好像少了什么东西,多了一个事件触发语句,这相当于什么呢?

相当于下面这个东西:

C# 之 鼠标点击进程 —— 截取图片_第22张图片

只不过对 MouseHook 修整了一下而已 . . .

如果我们不想截取一整个进程的图片,只想截取部分图片怎么办呢?

我们只需要借助 Graphics 类来实现即可:

例如下的操作:

C# 之 鼠标点击进程 —— 截取图片_第23张图片

先定义一个 Bitmap对象,用于存取截的图,定义 Graphics对象 关联到 Bitmap对象,使用 DrawImage开始指定大小截图,最后保存即可,效果如下所示:

C# 之 鼠标点击进程 —— 截取图片_第24张图片

如果我们在加一点算法,就可以获取各种各样进程中的指定图片了,是不是很有趣呢?

.


程序完事源码可访问:

GitHub --> Process-Screenshots

你可能感兴趣的:(C# 之 鼠标点击进程 —— 截取图片)