用python中的ctypes读取不同类型的剪贴板数据

2024-06-02 07:08:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码,它使用GetClipboardData函数中的CF_UNICODETEXT获取带有ctypes的windows剪贴板数据(文本)

from __future__ import print_function
import ctypes
import ctypes.wintypes as w

CF_UNICODETEXT = 13
CF_HDROP = 15

u32 = ctypes.windll.user32
k32 = ctypes.windll.kernel32

OpenClipboard = u32.OpenClipboard
OpenClipboard.argtypes = w.HWND,
OpenClipboard.restype = w.BOOL
GetClipboardData = u32.GetClipboardData
GetClipboardData.argtypes = w.UINT,
GetClipboardData.restype = w.HANDLE
GlobalLock = k32.GlobalLock
GlobalLock.argtypes = w.HGLOBAL,
GlobalLock.restype = w.LPVOID
GlobalUnlock = k32.GlobalUnlock
GlobalUnlock.argtypes = w.HGLOBAL,
GlobalUnlock.restype = w.BOOL
CloseClipboard = u32.CloseClipboard
CloseClipboard.argtypes = None
CloseClipboard.restype = w.BOOL


def get_clipboard_text():
    text = ""
    if OpenClipboard(None):
        h_clip_mem = GetClipboardData(CF_UNICODETEXT)
        text = ctypes.wstring_at(GlobalLock(h_clip_mem))
        GlobalUnlock(h_clip_mem)
        CloseClipboard()
    return text


print(get_clipboard_text())

CF_HDROP应该返回复制到剪贴板的文件列表, 但是我不能让它工作

如何让此代码返回文件列表而不仅仅是文本


Tags: textimportctypescfboolu32argtypesrestype
1条回答
网友
1楼 · 发布于 2024-06-02 07:08:22

如果CF_HDROP格式可用,可以使用DragQueryFile()首先告诉您存在多少文件。然后,您可以对每个条目调用一次以获取文件名。例如:

import sys
import ctypes
import ctypes.wintypes as w

CF_HDROP = 15

u32 = ctypes.windll.user32
k32 = ctypes.windll.kernel32
s32 = ctypes.windll.shell32

OpenClipboard = u32.OpenClipboard
OpenClipboard.argtypes = w.HWND,
OpenClipboard.restype = w.BOOL

GetClipboardData = u32.GetClipboardData
GetClipboardData.argtypes = w.UINT,
GetClipboardData.restype = w.HANDLE

CloseClipboard = u32.CloseClipboard
CloseClipboard.argtypes = None
CloseClipboard.restype = w.BOOL

DragQueryFile = s32.DragQueryFile
DragQueryFile.argtypes = [w.HANDLE, w.UINT, ctypes.c_void_p, w.UINT]


def get_file_list():
    files = []
    
    if OpenClipboard(None):
        h_hdrop = GetClipboardData(CF_HDROP)
        
        if h_hdrop:
            FS_ENCODING = sys.getfilesystemencoding()
            file_count = DragQueryFile(h_hdrop, -1, None, 0)

            for index in range(file_count):
                buf = ctypes.c_buffer(260)
                DragQueryFile(h_hdrop, index, buf, ctypes.sizeof(buf))
                files.append(buf.value.decode(FS_ENCODING))

    CloseClipboard()
    return files
    
print(get_file_list())

因此,如果您现在在Windows资源管理器中选择一些文件并使用Copy,脚本应该返回文件列表

相关问题 更多 >