我看过这个问题,并按照每个步骤进行操作,修改代码以满足我的要求,即Python3、Pillow和ctypes。库越少越好。
import ctypes
from PIL import ImageGrab, Image
from io import BytesIO
user32 = ctypes.windll.user32
img = ImageGrab.grab()
output = BytesIO()
img.convert("RGB").save(output, "BMP")
data = output.getvalue()[14:]
output.close()
user32.OpenClipboard()
user32.EmptyClipboard()
user32.SetClipboardData(user32.CF_DIB, data)
user32.CloseClipboard()
这是我脚本中的简化代码,我认为它是问题中相同的代码,根据我的要求进行了移植。运行时,它应该将当前桌面复制到剪贴板。但实际上我得到了以下结果:
File "C:\Users\Gcq\Documents\python\Screen\Screen.py", line 132, in shot
user32.OpenClipboard()
ValueError: Procedure probably called with not enough arguments (4 bytes missing)
很抱歉在这里问一个(可能)简单的问题,但我真的不知道哪里出了问题,ctypes也不是我的强项。
argtypes
和/或restype
,然后才能使用它。 - abarnertglobal_data
是一个指针,而global_mem
也是一个指针(指向内部数据结构的句柄;它不是句柄表中的小索引)。你需要为这些声明restype
,否则在Win64上你的代码将不正确。ctypes默认将数字转换为Cint
。此外,如果您不手动使用c_void_p
进行包装,则还需要设置argtypes
。 - Eryk Sun