使用ctypes从Windows中的剪贴板中读取文本

时间:2017-09-09 15:51:12

标签: python clipboard ctypes python-3.6

我只是在ctypes中使用Python 3.6尝试将文字存储在剪贴板中。我测试了很多我在Stack和GitHub上找到的解决方案,但它们仅适用于Python 2Python 3.4

这是您几乎无处不在的代码:

from ctypes import *

def get_clipboard_text():
    text = ""
    if windll.user32.OpenClipboard(c_int(0)):
        h_clip_mem = windll.user32.GetClipboardData(1)
        windll.kernel32.GlobalLock.restype = c_char_p
        text = windll.kernel32.GlobalLock(c_int(h_clip_mem))
        windll.kernel32.GlobalUnlock(c_int(h_clip_mem))
        windll.user32.CloseClipboard()
    return text

我在Python 3.4进行了测试。它工作正常并返回剪贴板中的文本。但是在Python 3.6上运行相同的脚本始终会返回None。到目前为止,我找不到Python 3.6的解决方案。

我想知道是否有人可以帮助我,因为我根本不了解ctypesC编程。

1 个答案:

答案 0 :(得分:5)

我的猜测是你使用的是64位Python 3.6,因此句柄是64位的,你将它们作为c_int(32位)传递。

使用ctypes时,最好明确所有参数和返回类型。以下代码应该适用于32位和64位Python 2和3。

此外,CF_UNICODETEXT将能够处理您复制的任何文本。

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

CF_UNICODETEXT = 13

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())