Skip to main content

粘贴板控制

粘贴字符串到粘贴板

import win32con
import win32clipboard as cp

cp.OpenClipboard() # 打开剪切板
"""
SetClipboardData方法向剪贴板写入数据,后面两个参数,第一个表示数据类型,
建议使用win32con.CF_UNICODETEXT,这样基本可以原样输出我们传入的数据
如果使用win32con.CF_TEXT:输出的是字节码~很别扭
注意!!!如果需要同时写入再获取内容,数据类型这个参数一定是使用一样的
"""
cp.SetClipboardData(win32con.CF_UNICODETEXT, "132465") # 向剪贴板中写入数据
cp.GetClipboardData()
result = cp.GetClipboardData(win32con.CF_UNICODETEXT) # 输出:132465
result1 = cp.GetClipboardData(win32con.CF_TEXT) # 输出:b'`O}Y\x00'
print(result, result1)

cp.CloseClipboard() # 关闭剪贴板

读取十进制文件到内存

在python中 需要复制一个文件到粘贴板,在需要时再粘贴。而不是用系统 os.system() 函数直接复制文件粘贴到新目标。

# -*- coding: utf-8 -*-
#
# @Author: CPS
# @email: 373704015@qq.com
# @Date:
# @Last Modified by: CPS
# @Last Modified time: 2023-08-16 14:51:07.436935
# @file_path "W:\CPS\MyProject\gis-api\utils"
# @Filename "clipborad.py"
# @Description: 使用win32api读取文件到粘贴板
#

import win32clipboard
from ctypes import c_uint, c_long, c_int, c_bool, Structure, sizeof


class DROPFILES(Structure):
_fields_ = [
("pFiles", c_uint),
("x", c_long),
("y", c_long),
("fNC", c_int),
("fWide", c_bool),
]


def set_clipboard_files(inputs: str | list[str]):
data = None
files = None

# 文件的绝对路径
if isinstance(inputs, str):
inputs = [inputs]

# 文件的绝对路径-列表
if isinstance(inputs, list)
files = ("\0".join(inputs)).replace("/", "\\")
data = files.encode("U16")[2:] + b"\0\0"

if not data:
return False

pDropFiles = DROPFILES()
pDropFiles.pFiles = sizeof(DROPFILES)
pDropFiles.fWide = True
matedata = bytes(pDropFiles)

win32clipboard.OpenClipboard()
try:
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32clipboard.CF_HDROP, matedata + data)
return True
except Exception as e:
print("set_clipboard_files error")
print(e)
return False
finally:
win32clipboard.CloseClipboard()


def read_clipboard_file_paths() -> str:
win32clipboard.OpenClipboard()
try:
return win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)
except Exception as e:
print("read_clipboard_file_paths error")
print(e)
finally:
win32clipboard.CloseClipboard()


# Example usage
if __name__ == "__main__":
filename = [r"W:\CPS\MyProject\gis-api\config.py"]
set_clipboard_files(filename)

代码剖析

这段代码主要是使用win32clipboard库与ctypes库来实现将文件路径添加到剪贴板,并从剪贴板中读取文件路径的功能。下面逐行解释每句代码的作用:

  1. import win32clipboard: 导入win32clipboard库,用于操作Windows剪贴板。

  2. from ctypes import *: 导入ctypes库的所有内容,ctypes库用于访问C语言中的函数、数据类型和结构体等。

  3. class DROPFILES(Structure):: 定义了一个名为DROPFILES的结构体。这个结构体代表了在剪贴板中存储文件路径所需的数据结构。

  4. _fields_: 定义了结构体DROPFILES的字段,它包括了文件指针、坐标等信息。

  5. def setClipboardFiles(paths):: 定义了一个函数setClipboardFiles,该函数接收一个包含文件路径的列表作为输入参数。

  6. pDropFiles = DROPFILES(): 创建一个DROPFILES的实例,用于存储文件路径信息。

  7. pDropFiles.pFiles = sizeof(DROPFILES): 设置pFiles字段为DROPFILES结构体的大小。

  8. pDropFiles.fWide = True: 设置fWide字段为True,表示文件路径使用宽字符编码。

  9. matedata = bytes(pDropFiles): 将pDropFiles结构体转换为字节流。

  10. files = ("\0".join(paths)).replace("/", "\\"): 将文件路径列表中的路径使用空字符连接,并将斜杠替换为反斜杠,以适应Windows文件路径格式。

  11. data = files.encode("U16")[2:] + b"\0\0": 将文件路径编码为UTF-16,并添加两个null字节作为结尾,以便在剪贴板中正确分隔路径。

  12. win32clipboard.OpenClipboard(): 打开剪贴板。

  13. try:: 开始try块,用于异常处理。

  14. win32clipboard.EmptyClipboard(): 清空剪贴板的内容。

  15. win32clipboard.SetClipboardData(win32clipboard.CF_HDROP, matedata + data): 将构造的文件路径数据添加到剪贴板中,使用CF_HDROP格式。

  16. print("123123"): 打印一条调试信息。

  17. finally:: 无论是否发生异常,都会执行finally块内的代码。

  18. win32clipboard.CloseClipboard(): 关闭剪贴板。

  19. def readClipboardFilePaths():: 定义了一个函数readClipboardFilePaths,用于从剪贴板中读取文件路径数据。

  20. win32clipboard.OpenClipboard(): 打开剪贴板。

  21. try:: 开始try块,用于异常处理。

  22. return win32clipboard.GetClipboardData(win32clipboard.CF_HDROP): 从剪贴板中获取使用CF_HDROP格式存储的文件路径数据。

  23. finally:: 无论是否发生异常,都会执行finally块内的代码。

  24. win32clipboard.CloseClipboard(): 关闭剪贴板。

总的来说,这段代码通过构造特定的数据结构将文件路径添加到剪贴板中,以便可以在其他应用程序中使用。然后,另一个函数用于从剪贴板中读取文件路径数据。这个过程是为了在剪贴板中传递文件路径,并允许用户将路径粘贴到其他应用程序中,类似于在聊天框中粘贴文件路径。

参阅文献