Python通过DragQueryFile从剪贴板获取文件不返回任何内容

2024-04-26 19:15:37 发布

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

我正在尝试制作一个简单的Python程序,它从剪贴板获取当前复制的文件。我用风铃来达到这个目的。我使用了一些已经存在的pyperclip工具中的代码(只能获取文本而不是文件),并尝试调整它来获取当前复制的文件。在

以下是我调用的函数的文档:https://msdn.microsoft.com/en-us/library/windows/desktop/bb776408(v=vs.85).aspx

剪贴板函数的引用:https://msdn.microsoft.com/en-us/library/windows/desktop/ff468802(v=vs.85).aspx

import ctypes
from ctypes.wintypes import *
from ctypes import c_size_t, sizeof, c_wchar_p, get_errno, c_wchar, c_ulong, c_uint32

class CheckedCall(object):
    def __init__(self, f):
        super(CheckedCall, self).__setattr__("f", f)

    def __call__(self, *args):
        ret = self.f(*args)
        if not ret and get_errno():
            raise PyperclipWindowsException("Error calling " + self.f.__name__)
        return ret

    def __setattr__(self, key, value):
        setattr(self.f, key, value)

windll = ctypes.windll

safeCreateWindowExA = CheckedCall(windll.user32.CreateWindowExA)
safeCreateWindowExA.argtypes = [DWORD, LPCSTR, LPCSTR, DWORD, INT, INT,
                                    INT, INT, HWND, HMENU, HINSTANCE, LPVOID]
safeCreateWindowExA.restype = HWND

safeDestroyWindow = CheckedCall(windll.user32.DestroyWindow)
safeDestroyWindow.argtypes = [HWND]
safeDestroyWindow.restype = BOOL

OpenClipboard = windll.user32.OpenClipboard
OpenClipboard.argtypes = [HWND]
OpenClipboard.restype = BOOL

clipboarddata=CheckedCall(windll.user32.GetClipboardData)
clipboarddata.argtypes = [UINT]
clipboarddata.restype = HANDLE

safeCloseClipboard = CheckedCall(windll.user32.CloseClipboard)
safeCloseClipboard.argtypes = []
safeCloseClipboard.restype = BOOL

hwnd = safeCreateWindowExA(0, b"STATIC", None, 0, 0, 0, 0, 0,None, None, None, None)
print(hwnd)
print(OpenClipboard(hwnd))

hendl=clipboarddata(15)
print(hendl)


text = ctypes.create_string_buffer(255)

UINTval=windll.shell32.DragQueryFile(c_uint32(hendl),c_uint32(0),text,c_uint32(255))
print(repr(text.raw))
print(UINTval)


safeCloseClipboard()

只需稍作调整,这段代码就可以完美地工作在剪贴板上的文本中,但它不能处理文件。也许我遗漏了一些显而易见的东西,或者只是误解了规范。在

系统:Python3.5.2,Windows 8.1


Tags: 文件selfnonectypesintprintuint32hwnd