python-剪贴板的操作-文件相关(复制文件到剪贴板,剪切文件到剪贴板)

  1. 读取有没有文件被复制或剪切
import win32clipboard

a = ""
clip = win32clipboard.RegisterClipboardFormat("Preferred DropEffect")
#返回的clip 就是我们将要代入GetClipboardData函数的该数据结构的代码
if win32clipboard.OpenClipboard() == None:
    try:
        #尝试以文件的格式读取剪贴板内容
        clip_ = win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)
        if clip_ != None:
            #获取标志位
            a = win32clipboard.GetClipboardData(clip)
    finally:
        win32clipboard.CloseClipboard()
if a[0] == 2:
    print("剪切")
elif a[0] == 5:
    print("复制")
else:
    print(a[0])    

关于“clip = win32clipboard.RegisterClipboardFormat("Preferred DropEffect")”我也是看别人的博客写的,为什么传递这个字符串我也不明白,我也没有尝试过传递其他的行不行。

传送门:如何与资源管理器互动剪切/拷贝/粘贴文件_xuyongbeijing2008的专栏-CSDN博客

  1. 实现复制文件操作
#参考:https://chowdera.com/2021/10/20211031055535475l.html
#这其实是一个结构体,用以记录文件的各种信息。
class DROPFILES(ctypes.Structure):
    _fields_ = [
        ("pFiles", ctypes.c_uint),
        ("x", ctypes.c_long),
        ("y", ctypes.c_long),
        ("fNC", ctypes.c_int),
        ("fWide", ctypes.c_bool),
    ]

pDropFiles = DROPFILES()
pDropFiles.pFiles = ctypes.sizeof(DROPFILES)
pDropFiles.fWide = True
a = bytes(pDropFiles)

#获取文件绝对路径
filepaths_list = [文件路径1,文件路径2,]
files = ("\0".join(filepaths_list)).replace("/", "\\")
data = files.encode("U16")[2:] + b"\0\0"        #结尾一定要两个\0\0字符,这是规定!

'''
对于多个文本路径,我们如何将其转换为我们需要的Unicode 双字节形式呢?
首先,我们要知道Unicode编码采用UCS-2格式直接存储,而UTF-16恰好对应于UCS-2的,即UCS-2指定的码位通过大端或小端的方式直接保存。UTF-16 有三种类型:UTF-16,UTF-16BE(大端序),UTF-16LE(小端序).UTF-16 通过以名称BOM(字节顺序标记,U + FEFF)启动文件来指示该文件仍然是小端序。
我们只需要把python String使用UTF-16编码后,去掉前两个字节,得到相应的Unicode双字节。
'''
win32clipboard.OpenClipboard()  #打开剪贴板(独占)
try:
    #若要将信息放在剪贴板上,首先需要使用 EmptyClipboard 函数清除当前的剪贴板内容
    win32clipboard.EmptyClipboard() #清空当前的剪贴板信息
    win32clipboard.SetClipboardData(win32clipboard.CF_HDROP,bytes(pDropFiles)+data) #设置当前剪贴板数据
except Exception as e:
    print(str(e))
finally:
    win32clipboard.CloseClipboard() #无论什么情况,都关闭剪贴板
  1. 实现剪切文件

待更新

上一篇:解决文件下载输出流中文件名称不显示中文问题


下一篇:Qt - 中文乱码原因以及解决方法