0x01 Win32 API简介

Win32 API即为Microsoft 32位平台(包括:Windows 9x, Windows NT3.1/4.0/5.0, WindowsCE等)的应用程序编程接口(Application Programming Interface),是构筑所有32位Windows平台的基石,所有在Win32平台上运行的应用程序都可以调用这些函数。

使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。 Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用 Win32 API不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。

在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。例如,安全函数只能在Windows NT操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。

标准Win32 API函数可以分为以下几类:

窗口管理

窗口通用控制

Shell特性

图形设备接口

系统服务

国际特性

网络服务

0x02 Pywin32

1、安装Pywin32

由于本次操作是使用python来操作Win32api,需要先安装Pywin32,可以从这里下载对应的Python和Windows版本文件,下载完后直接运行安装就可以了。

2、截图思路

截图操作的大致思路如下:

模拟按下键盘上的“win + PrtSc”组合键

从剪贴板读取缓存的截图

将截图文件保存在本地

3、模拟按键

win32api.keybd_event(0x91, 0, 0, 0) # 0x91 --> win key

win32api.keybd_event(0x2C, 0, 0, 0) # 0x2C --> PRINT SCREEN key

win32api.keybd_event(0x91, 0, win32con.KEYEVENTF_KEYUP, 0)

win32api.keybd_event(0x2C, 0, win32con.KEYEVENTF_KEYUP, 0)

4、PrtSc相关知识

当按下“win + PrtSc”组合键后,截图被保存在剪贴板中,可以直接在word或者是附件中的画图程序里粘贴后使用,使用剪贴板查看器可以查看剪贴板的内容。

剪贴板在Windows 7/8/10 中是没有的,可以在网上搜索下载一个,一般为clipbrd.exe。

clipbrd.png

自己操作下就会发现,剪贴板只能存储最近复制的内容,新内容会替换旧内容(不区分图片或文字),QQ截图使用的也是系统剪贴板。

从剪贴板查看器的查看选项可以看到,这里有两种图片格式:位图和DIB位图。

clipbrd_screen.png

5、从剪贴板中读取截图

win32clipboard.IsClipboardFormatAvailable(formats)确定剪贴板是否包含指定格式的数据。

win32clipboard.GetClipboardData(formats)可以从剪贴板里读取数据。

win32clipboard.OpenClipboard()

if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_DIB):

data = win32clipboard.GetClipboardData(win32clipboard.CF_DIB)

6、BMP简介

BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

典型的BMP图像文件由四部分组成:

位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;

位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;

调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;

位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。

7、构建结构体

BMP文件头结构体

class BITMAPFILEHEADER(Structure):

_pack_ = 1

_fields_ = [

('bfType', WORD),

('bfSize', DWORD),

('bfReserved1', WORD),

('bfReserved2', WORD),

('bfOffBits', DWORD),

]

位图信息头结构体

class BITMAPINFOHEADER(Structure):

_pack_ = 1

_fields_ = [

('biSize', DWORD),

('biWidth', LONG),

('biHeight', LONG),

('biPLanes', WORD),

('biBitCount', WORD),

('biCompression', DWORD),

('biSizeImage', DWORD),

('biXpelsPerMeter', LONG),

('biYpelsPerMeter', LONG),

('biClrUsed', DWORD),

('biClrImportant', DWORD),

]

用sizeof获取二者的大小并赋值给SIZEOF_BITMAPFILEHEADER和SIZEOF_BITMAPINFOHEADER。

8、拷贝截图数据

BitMapInfoHeaderHandle = BITMAPINFOHEADER()

memmove(pointer(BitMapInfoHeaderHandle), data, SIZEOF_BITMAPINFOHEADER)

BitMapFileHeaderHandle = BITMAPFILEHEADER()

memset(pointer(BitMapFileHeaderHandle), 0, SIZEOF_BITMAPFILEHEADER)

9、写文件头

BitMapFileHeaderHandle.bfType = ord('B') | (ord('M') << 8)

BitMapFileHeaderHandle.bfSize = SIZEOF_BITMAPFILEHEADER + len(data)

SIZEOF_COLORTABLE = 0

BitMapFileHeaderHandle.bfOffBits = SIZEOF_BITMAPFILEHEADER + SIZEOF_BITMAPINFOHEADER + SIZEOF_COLORTABLE

10、生成图片

以二进制方式,先写文件头,再写从剪贴板获取到的字符串到本地的.bmp文件中,完成图片生成。

with open(filename, 'wb') as bmp_file:

bmp_file.write(BitMapFileHeaderHandle)

bmp_file.write(data)

print 'file "{}" created from clipboard image'.format(filename)

0x03 完整代码

python调用win32api详解_Python调用Win32 API实现截图相关推荐

  1. python协程详解_python协程详解

    原博文 2019-10-25 10:07 − # python协程详解 ![python协程详解](https://pic2.zhimg.com/50/v2-9f3e2152b616e89fbad86 ...

  2. python average函数详解_python 函数详解

    函数函数是代码的一种组织形式 函数应该能完成一项特定的工作,而且一般一个函数只完成一项工作 有些语言,分函数和过程两个概念,通俗解释是,有返回结果的是函数,无返回结果的叫过程,python不加以区分 ...

  3. python中configparser详解_Python中的ConfigParser模块使用详解

    1.基本的读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该sect ...

  4. python 元类 详解_Python 元类详解 __new__、__init__、__call__、__metacalss__

    了解元类之前,先了解几个魔术方法: __new__.__init__.__call__ __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪 ...

  5. python requests库详解_python爬虫之路(一)-----requests库详解

    requests库 requests库是python实现的最简单易用的http库. requests库的功能详解. 我们可以自然而然地想到这些方法其实就是http协议对资源的操作. 调用request ...

  6. python average函数详解_python基础之函数详解

    Python基础之函数详解 一.函数的定义 到现在为止,我们已经掌握了Python的基本语法和数据类型等相关基础知识了,以进行一个项目的编写了,这个时候,就会发现,很多代码需要我们进行复制粘贴,这简直 ...

  7. python pexpect模块详解_python pexpect原理详解及使用说明

    pexpect是python中用于实现SSH,FTP,telnet等命令进行自动化交互,从而无需人工干预实现自动化运维的一个第三方扩展模块.理论的描述过于抽象,这里首先设想一下,如果让您设计一个实现自 ...

  8. python int函数详解_Python内置函数OCT详解

    英文文档:oct ( x ) Convert an integer number to an octal string. The result is a valid Python expression ...

  9. python时间函数详解_Python:Numpy库基础分析——详解datetime类型的处理

    原标题:Python:Numpy库基础分析--详解datetime类型的处理 Python:Numpy库基础分析--详解datetime类型的处理 关于时间的处理,Python中自带的处理时间的模块就 ...

  10. python scatter参数详解_Python中scatter函数参数及用法详解

    最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...

最新文章

  1. 从linux小白到进大厂,我是怎么做到的?
  2. hue集成hbase出现TSocket read 0 bytes
  3. PHP 基础知识-数组
  4. 拖链电缆 机器人电缆_尼龙拖链在机器中起着电缆的作用
  5. 别说了,叫爸爸吧! | 今日最佳
  6. Zend Framework 多模块配置 (二)
  7. RDLC报表其余空白页问题
  8. Linux下grub.cnf详解
  9. android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法](转)
  10. Leecode刷题热题HOT100(1)——两数之和
  11. 照片快照清除 android,如何在Android中删除和恢复照片
  12. 未来已来!分布式数据库的“星辰大海”绝不仅限于替换!
  13. 理解HTTP/2的多路复用
  14. 深度学习的应用及主流框架
  15. JavaScript,5种调用函数的方法
  16. MyBatis官方文档——SQL语句构建及日志部分
  17. 图解排序算法之堆排序(Java)
  18. 保存的离线网页总是自动跳转怎么办???
  19. 关于嵌入式的学习和职业发展
  20. 选择system bus还是session bus?

热门文章

  1. 数字化定量分析_数字化驱动下的华夏银行信用卡精细化智能服务
  2. 设计教务管理系统MySQL,数据库设计实例 教务管理系统
  3. qt鼠标键盘钩子类设计
  4. 摩托车电动化,一场千亿美元的新战争
  5. powerbuilder mysql_powerbuilder+mysql5.0的连接过程 | 学步园
  6. Unix / Linux 文件系统
  7. 负载均衡与服务器架构
  8. 为你收罗100个学英语的网站!!!
  9. 动易CMS - 模板的一些常用标签
  10. Oracle下载账户