Python win32clipboard 操作剪贴板中文字,图片,链接等信息

前言(补)

这篇文章发布已经很久了,本来是没怎么排过版的,但是由于后台数据反馈很多粉丝都是因为他关注了我,再次为表谢意,盧瞳已在繁忙的学习中抽出时间仔仔细细通读了自己的文章,并精心进行了全篇的修改

具体代码(不待自己写的小伙伴粘贴就能用)

使用概述(先说调用方法,类的源码紧接着在后面,大家自己复制一下)

使用步骤(为了照顾刚刚入坑Python的同学我说的啰嗦一点)

  1. 复制代码到项目下的XXX.py文件(点此跳转到代码位置
  2. 在需要操作剪贴板的源码文件中引用from XXX import OperationClipboard
  3. 创建类的实例化对象operationClipboard = OperationClipboard()
  4. 方便地调用作者为你编写的方法吧!具体提供了get_clipboard() 这个方法,但是可能还是有点麻烦别着急下面我专门写了一个使用例子包含getText() getPicPath() getFilePathList() setText() savePic这几个方法,写他们的目的一方面是为了告诉大家这个类怎么用,另一方面也是让大家能够粘贴代码直接使用,从名字上也不难看出他们的作用分别是:获取文本,获取图片路径,获取文件路径(比如说你复制了一堆文件,这时候就能从剪贴板中拿到所有复制文件的具体路径组成的列表)

下面是一个具体操作的代码:

from XXX import OperationClipboard

'''
实例化后直接调用get_clipboard()方法,返回一个dict,有两个键值'format'和'data',data是得到的剪贴板数据,format指定了数据的格式(就像是这样{'format':"Unicode",'data':"这是剪贴板中的Unicode格式数据"})
下面是format所有出现的键值和所代表的含义:
	Unicode : Unicode编码文本
	ANSI : ANSI编码文本
	BITMAP : 位图句柄
	HDROP : 文件地址元组
所以思路就很明确了,调用get_clipboard(),检查返回字典的'format'是否与预期相符,相符获取返回字典的'data'就好
'''

# 读取文本数据(以Unicode为例)
def getText():
	operationClipboard = OperationClipboard()
	result = operationClipboard.get_clipboard()
	if result['format'] == 'Unicode':
		text = result['data']
# 读取图片数据并保存为jpg格式,获取其路径
def getPicPath():
	operationClipboard = OperationClipboard()
	result = operationClipboard.get_clipboard()
	if result['format'] == 'BITMAP':
		filePath = operationClipboard.savePic(self,"c:")
# 读取文件元组,并遍历输出
def getFilePathList():
	operationClipboard = OperationClipboard()
	result = operationClipboard.get_clipboard()
	if result['format'] == 'HDROP':
		filePathList = result['data']
		for filePath in filePathList:
			print(filePath)
# 向剪贴板写入数据(不是主要功能,这里仅写了字符串的)
def setText():
	operationClipboard = OperationClipboard()
	text = "要写入剪贴板的文本"
	operationClipboard.set_clipboard(text)

代码实现(已封装类可以直接复制使用)

代码说明:
实例化后直接调用get_clipboard()方法,返回一个dict,有两个键值’format’和’data’,data是得到的剪贴板数据,format指定了数据的格式(就像是这样{‘format’:“Unicode”,‘data’:“这是剪贴板中的Unicode格式数据”})
下面是format所有出现的键值和所代表的含义:
Unicode : Unicode编码文本
ANSI : ANSI编码文本
BITMAP : 位图句柄
HDROP : 文件地址元组

import os

import win32con,time
from uuid import uuid1
from win32clipboard import GetClipboardData, OpenClipboard, CloseClipboard, EmptyClipboard, SetClipboardData, \
    EnumClipboardFormats
from PIL import Image, ImageGrab

class OperationClipboard:
    # 读取剪贴板的数据
    def get_clipboard(self):
        OpenClipboard() # 打开剪贴板
        formats = []
        lastFormat = 0
        while 1:
            nextFormat = EnumClipboardFormats(lastFormat)
            if 0 == nextFormat:
                break
            else:
                formats.append(nextFormat)
                lastFormat = nextFormat
        CloseClipboard()
        if formats == []:
            return None
        elif 13 in formats:
            return {'format':"Unicode",'data':GetClipboardData(13)}
        elif 1 in formats:
            return {'format': "ANSI", 'data': GetClipboardData(1)}
        elif win32con.CF_BITMAP in formats:
            return {'format': "BITMAP", 'data': GetClipboardData(2)}
        elif 15 in formats:
            return {'format': "HDROP", 'data': GetClipboardData(15)}
        '''
        完整 : win32con.CF_TEXT
        CF_TEXT(1):文本格式。 每行以回车/换行符结尾 (CR-LF) 组合。 空字符指示数据的末尾。 将此格式用于 ANSI 文本。
        CF_UNICODETEXT(13):Unicode 文本格式。 每行以回车/换行符结尾 (CR-LF) 组合。 空字符指示数据的末尾。
        CF_BITMAP(2):位图 (HBITMAP) 的句柄。
        CF_HDROP(15):文件地址元组
        '''

    # 写入剪贴板数据
    def set_clipboard(self,astr:str):
        OpenClipboard()
        EmptyClipboard()
        # 可以sleep一下,防止操作过快报错
        # time.sleep(1)
        SetClipboardData(win32con.CF_UNICODETEXT, astr)
        CloseClipboard()

    def savePic(self,Path):
        im = ImageGrab.grabclipboard()
        if isinstance(im, Image.Image):
            imgName = self.getUUID() + '.jpg'
            filePath = os.path.join(Path, "res/img/%s" % imgName)
            rgb_im = im.convert('RGB')
            rgb_im.save(filePath)
            return filePath
    def getUUID(self):
        return uuid1().hex

到此为止如果不想继续探究盧瞳是怎么造出这个轮子的读者就可以告退了(喜欢的话别忘了点赞,收藏,关注),想要具体了解win32clipboard这个库的读者朋友请继续向下看在这里插入图片描述

原理说明

使用win32clipboard的大致步骤

  1. 导包from win32clipboard import GetClipboardData, OpenClipboard, CloseClipboard, EmptyClipboard, SetClipboardData, \ EnumClipboardFormats
  2. 打开剪贴板OpenClipboard()
  3. 获取数据(这个有点麻烦,下面我们说)
  4. 关闭剪贴板CloseClipboard()
    总的来说,想要使用剪贴板,就得先告诉win系统,“哎,我要用剪贴板了”(毕竟剪贴板是系统在维护,要使用当然需要系统配合),这就是所谓的OpenClipboard() 再这之后你就能访问他的数据了,注意使用完了之后一定要告诉系统我用完了CloseClipboard()这很重要,不然系统会以为你还在使用剪贴板,导致其一直处于”占用“状态,其他程序想要使用就获取不到了。

下面来具体说说获取数据的步骤:

判断剪贴板是否有数据及获取所有可用数据类型

原理说明:
当第一次调用EnumClipboardFormats函数时,传入参数0,如果剪贴板有数据那么它的返回值为剪贴板中第一个可用数据格式(这里设为format),如果剪贴板中没有数据,则返回0。
当有数据返回第一条数据format,也可以说是返回非零值时:
如果要继续枚举其它的剪贴板数据格式,则把format参数原样传给EnumClipboardFormats,这个函数就会返回下一条数据(如果有的话),按照这样的思路我们不断把它返回的format重复传回,直到函数返回0为止就能得到所有的可用格式。

接下来,我们有了一个当前剪贴板中所有可用格式的列表formatList(假设每次返回的format都被你放到了formatList里面),那么我们就能使用GetClipboardData()来获取对应的数据了,微软官方给出了所有可用格式的详细说明,诸如枚举名和值以及所对应数据的一些解释,这个表我已经给大家放到下面了,此外盧瞳还专门将其中的一些常用类型挑了出来,方便大家查看。

具体内容请查看附录
附录
*******附录一:数据类型介绍(官方的全方位说明,说实话有点难懂)
*******附录二:简单使用(常用的类型及解释)

获取数据这一步骤的相应源码展示

看完之前的解释以及附录中所带的数据格式说明,那么具体操作代码如下:

formats = [] # 储存所有的可用数据类型,如果为空代表剪贴板没有数据
lastFormat = 0
while 1:
	win32con.CF_TEXT
	nextFormat = EnumClipboardFormats(lastFormat)
	if 0 == nextFormat:
		break
	else:
		formats.append(nextFormat)
		lastFormat = nextFormat
print(formats)

好了,这一篇教程到此就完结了,喜欢的话请点赞收藏哈~

附录

附录一:数据类型介绍(官方的全方位说明,说实话有点难懂)

来自微软官方的常量说明

常量/值描述
CF_BITMAP 2
位图 (HBITMAP) 的句柄。
CF_DIB 8
包含 BITMAPINFO 结构的内存对象,后跟位图位。
CF_DIBV5 17
包含 BITMAPV5HEADER 结构的内存对象,后跟位图颜色空间信息和位图位。
CF_DIF 5
软件艺术的数据交换格式。
CF_DSPBITMAP 0x0082
与专用格式关联的位图显示格式。 hMem 参数必须是可以以位图格式显示的数据的句柄,而不是私有格式的数据。
CF_DSPENHMETAFILE 0x008E
与专用格式关联的增强图元文件显示格式。 hMem 参数必须是可以以增强型图元文件格式显示的数据的句柄,而不是私有格式的数据。
CF_DSPMETAFILEPICT 0x0083
与专用格式关联的图元文件图片显示格式。 hMem 参数必须是可以以图元文件图片格式显示的数据的句柄,而不是私有格式的数据。
CF_DSPTEXT 0x0081
与专用格式关联的文本显示格式。 hMem 参数必须是可以以文本格式显示的数据的句柄,而不是私有格式的数据。
CF_ENHMETAFILE 14
增强的图元文件句柄 (HENHMETAFILE) 。
CF_GDIOBJFIRST 0x0300
"开始"菜单应用程序定义的 GDI 对象剪贴板格式的整数值范围。 范围的末尾 CF_GDIOBJLAST
当剪贴板被清空时,不会使用 GlobalFree 函数自动删除与此区域中的剪贴板格式关联的句柄。 此外,在此范围内使用值时, hMem 参数不是 GDI 对象的句柄,而是由 GlobalAlloc 函数分配的句柄,带有 GMEM_MOVEABLE 标志。
CF_GDIOBJLAST 0x03FF
请参阅 CF_GDIOBJFIRST
CF_HDROP 15
用于键入用于标识文件列表的 HDROP 的句柄。 应用程序可以通过将句柄传递给 DragQueryFile 函数来检索有关文件的信息。
CF_LOCALE 16
数据是 (HGLOBAL) 与剪贴板中的文本关联的区域设置标识符 (LCID) 句柄。 关闭剪贴板时,如果它包含 CF_TEXT 数据但没有 CF_LOCALE 数据,系统会自动将 CF_LOCALE 格式设置为当前输入语言。 可以使用 CF_LOCALE 格式将其他区域设置与剪贴板文本相关联。
粘贴剪贴板中的文本的应用程序可以检索此格式,以确定用于生成文本的字符集。
请注意,剪贴板不支持多个字符集中的纯文本。 为此,请改用带格式的文本数据类型,例如 RTF。
系统使用与 CF_LOCALE 关联的代码页从 CF_TEXT 隐式转换为 CF_UNICODETEXT。 因此,正确的代码页表用于转换。
CF_METAFILEPICT 3
处理 METAFILEPICT 结构定义的图元文件图片格式。 通过 DDE 传递 CF_METAFILEPICT 句柄时,负责删除 hMem 的应用程序还应释放 CF_METAFILEPICT 句柄引用的图元文件。
CF_OEMTEXT 7
包含 OEM 字符集中字符的文本格式。 每行以回车/换行符结尾 (CR-LF) 组合。 空字符指示数据的末尾。
CF_OWNERDISPLAY 0x0080
所有者显示格式。 剪贴板所有者必须显示和更新剪贴板查看器窗口,并接收 WM_ASKCBFORMATNAMEWM_HSCROLLCLIPBOARDWM_PAINTCLIPBOARDWM_SIZECLIPBOARDWM_VSCROLLCLIPBOARD 消息。 hMem 参数必须为 NULL
CF_PALETTE 9
调色板的句柄。 每当应用程序将数据放置在依赖于或假定调色板的剪贴板中时,它也应该将调色板放在剪贴板上。
如果剪贴板包含 CF_PALETTE ( 逻辑调色板) 格式的数据,则应用程序应使用 SelectPaletteRealizePalette 函数来实现 (将剪贴板中任何其他数据与该逻辑调色板进行比较) 。
显示剪贴板数据时,剪贴板始终用作其当前调色板的任何对象,该剪贴板采用 CF_PALETTE 格式。
CF_PENDATA 10
笔扩展的数据,适用于笔计算的 Microsoft Windows。
CF_PRIVATEFIRST 0x0200
"开始"菜单专用剪贴板格式的整数值范围。 范围以 CF_PRIVATELAST结尾。 与专用剪贴板格式关联的句柄不会自动释放;剪贴板所有者必须释放此类句柄,通常是响应 WM_DESTROYCLIPBOARD 消息。
CF_PRIVATELAST 0x02FF
请参阅 CF_PRIVATEFIRST
CF_RIFF 11
表示比 CF_WAVE 标准波形格式更复杂的音频数据。
CF_SYLK 4
Microsoft 符号链接 (SYLK) 格式。
CF_TEXT 1
文本格式。 每行以回车/换行符结尾 (CR-LF) 组合。 空字符指示数据的末尾。 将此格式用于 ANSI 文本。
CF_TIFF 6
标记图像文件格式。
CF_UNICODETEXT 13
Unicode 文本格式。 每行以回车/换行符结尾 (CR-LF) 组合。 空字符指示数据的末尾。
CF_WAVE 12
表示采用标准波形格式之一(例如 11 kHz 或 22 kHz PCM)的音频数据。

附录二:简单使用(常用的类型及解释)

常量名常量值常量说明
CF_TEXT1文本格式。 每行以回车/换行符结尾 (CR-LF) 组合。 空字符指示数据的末尾。 将此格式用于 ANSI 文本。
CF_UNICODETEXT13Unicode 文本格式。 每行以回车/换行符结尾 (CR-LF) 组合。 空字符指示数据的末尾。
CF_BITMAP2位图 (HBITMAP) 的句柄。
CF_HDROP15用于键入用于标识文件列表的 HDROP 的句柄。 应用程序可以通过将句柄传递给 DragQueryFile 函数来检索有关文件的信息。

其中CF_TEXTCF_UNICODETEXT好理解,一个返回ASCII文本,一个返回Unicode 文本,值得注意的是,他们好像是默认转换的,而且只能取一个,例如:当你先使用CF_TEXT再调用CF_UNICODETEXT就会得到空值None(作者自己尝试结果,如有错误请大家指正)
CF_BITMAP会拿到一个位图句柄 , 它出现的条件是例如用win+shift+s来截图,所得图片会自动保存在剪贴板 , 我们监听这个常量 , 如果出现代表剪贴板中出现图像数据 , 接下来用PIL来获取剪贴板的图片转化并保存为你想要的格式
CF_HDROP返回的是一个由文件路径组成的元组 , 比如说你选中一堆文件然后复制 , 这时调用这个值就会得到所有复制文件的路径组成的元组

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盧瞳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值