要查看当前剪切板的数据,我们可以使用Free Clipboard Viewerhttps://freeclipboardviewer.com/cn/

例如我们将微信输入框中的字符串复制到剪切板,可以看到原始数据是下面这样:

Python读取任意格式的剪切板内容_剪切板


下面我们看看如何使用Python读取任意剪切板的内容:

import win32clipboard


def get_predefined_formats():
    import win32con
    predefined_formats = {}
    for name in dir(win32con):
        if not name.startswith('CF_'):
            continue
        value = getattr(win32con, name)
        if isinstance(value, int) and value not in predefined_formats:
            predefined_formats[value] = name
    return predefined_formats


PREDEFINED_FORMATS = get_predefined_formats()


def get_clipboard_data() -> dict:
    data = {}
    win32clipboard.OpenClipboard()
    try:
        clipboard_format = 0
        while True:
            clipboard_format = win32clipboard.EnumClipboardFormats(clipboard_format)
            if clipboard_format == 0:
                break
            format_name = PREDEFINED_FORMATS.get(clipboard_format)
            if format_name is None:
                format_name = win32clipboard.GetClipboardFormatName(clipboard_format)
            data[format_name] = win32clipboard.GetClipboardData(clipboard_format)
    finally:
        win32clipboard.CloseClipboard()
    return data

调用get_clipboard_data函数,即可每种格式对应的内容:

if __name__ == '__main__':
    clipboard_data = get_clipboard_data()
    print("clipboard_data", clipboard_data)

结果如下:

clipboard_data {'WeChat_RichEdit_Format': b'<WeChatRichEditFormat><EditElement type="2" shortcut="[\xe5\x8f\xaf\xe6\x80\x9c]" filepath="" /><EditElement type="0"><![CDATA[\xe4\xbd\xa0\xe5\xa5\xbd]]></EditElement><EditElement type="2" shortcut="[\xe5\x91\xb2\xe7\x89\x99]" filepath="" /><EditElement type="0"><![CDATA[\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88]]></EditElement></WeChatRichEditFormat>\x00', 'RTX_RichEdit_Format': b'<RTXRichEditFormat><EditElement type="2" shortcut="[\xe5\x8f\xaf\xe6\x80\x9c]" filepath="" /><EditElement type="0"><![CDATA[\xe4\xbd\xa0\xe5\xa5\xbd]]></EditElement><EditElement type="2" shortcut="[\xe5\x91\xb2\xe7\x89\x99]" filepath="" /><EditElement type="0"><![CDATA[\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88]]></EditElement></RTXRichEditFormat>\x00', 'QQ_Unicode_RichEdit_Format': b'<QQRichEditFormat><EditElement type="2" shortcut="/:8*" filepath="" /><EditElement type="0"><![CDATA[\xe4\xbd\xa0\xe5\xa5\xbd]]></EditElement><EditElement type="2" shortcut="/::D" filepath="" /><EditElement type="0"><![CDATA[\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88]]></EditElement></QQRichEditFormat>\x00', 'CF_UNICODETEXT': '你好哈哈哈', 'CF_ENABLETEMPLATE': b'\x04\x08\x00\x00', 'CF_SCREENFONTS': b'\xc4\xe3\xba\xc3\xb9\xfe\xb9\xfe\xb9\xfe', 'CF_OEMTEXT': b'\xc4\xe3\xba\xc3\xb9\xfe\xb9\xfe\xb9\xfe'}

要解析微信的这种格式的数据,我们下面给个示例:

def parse_weixin_clipboard_data(data):
    wechat_rich_edit_data = data.get("WeChat_RichEdit_Format")
    if wechat_rich_edit_data is None:
        return data.get("CF_UNICODETEXT")
    xml_str = wechat_rich_edit_data.decode("u8").strip('\x00')
    root = ET.fromstring(xml_str)
    result = ""
    for element in root.findall('EditElement'):
        element_type = element.get('type')
        if element_type == '2':
            result += element.get('shortcut')
        elif element_type == '0':
            result += element.text
        elif element_type == '9':
            result += element.get('filepath')
        elif element_type == '1':
            result += f"![image]({element.get('filepath')})"
    return result

可以解析几种常见的情况,图片路径解析到Markdown格式。

如果我们在微信中复制了一张单独的图片,可以使用下面的函数,解析图片路径或图片内容:

def parse_image_data(image_data):
    image_data = image_data.get("CF_DIB")
    if image_data is None:
        return
    image = BmpImagePlugin.DibImageFile(io.BytesIO(image_data))
    return image


def parse_weixin_image_path(data):
    return data.get("CF_HDROP")

使用示例:

if __name__ == '__main__':
    clipboard_data = get_clipboard_data()
    clipboard_data = get_clipboard_data()
    print("parse_weixin_image_path", parse_weixin_image_path(clipboard_data))
    print("parse_image_data", parse_image_data(clipboard_data))

结果示例:

parse_weixin_image_path ('D:\\weixinData\\WeChat Files\\wowangzhouming\\FileStorage\\Temp\\1724386471543.jpg',)
parse_image_data <PIL.BmpImagePlugin.DibImageFile image mode=RGB size=315x174 at 0x266EB4E17F0>