Python使用winapi通过DragQueryFile从剪贴板获取文件时不返回任何内容
我试图制作一个简单的Python程序,它从剪贴板获取当前复制的文件。我用风车来实现这一点。我使用了已经存在的pyperclip工具中的一些代码(只能获取文本而不是文件),并尝试对其进行调整以获取当前复制的文件 以下是我正在调用的函数的文档: 剪贴板函数的参考: 经过一些调整,这段代码可以完美地从剪贴板中删除文本,但它无法处理文件。也许我遗漏了一些明显的东西,或者只是误解了规范Python使用winapi通过DragQueryFile从剪贴板获取文件时不返回任何内容,python,winapi,clipboard,Python,Winapi,Clipboard,我试图制作一个简单的Python程序,它从剪贴板获取当前复制的文件。我用风车来实现这一点。我使用了已经存在的pyperclip工具中的一些代码(只能获取文本而不是文件),并尝试对其进行调整以获取当前复制的文件 以下是我正在调用的函数的文档: 剪贴板函数的参考: 经过一些调整,这段代码可以完美地从剪贴板中删除文本,但它无法处理文件。也许我遗漏了一些明显的东西,或者只是误解了规范 系统:Python3.5.2,Windows 8.1为什么你认为剪贴板涉及拖放?我看到它是这样使用的,我没有看到任何类似
系统:Python3.5.2,Windows 8.1为什么你认为剪贴板涉及拖放?我看到它是这样使用的,我没有看到任何类似的原因拖放和剪贴板是不同的系统服务。它们之间没有任何关系,除了一个事实,即蹩脚的工具使用复制粘贴作为用户不友好的借口来实现拖放。那么我应该使用什么呢?如果文件是通过拖放方式复制的,您将无能为力。这是在源和丢弃目标之间单独建立的协议。除非拖放提供了安装钩子的截取点(我不知道这一点),否则无法检索您所要的信息。
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()