使用 ctypes 从 Windows 中的剪贴板读取文本
Read text from clipboard in Windows using ctypes
我试图通过在 Python 3.6
中使用 ctypes
来获取存储在剪贴板中的文本。我测试了很多在 Stack 和 GitHub 上找到的解决方案,但它们只适用于 Python 2
到 Python 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
上的相同脚本总是 returns None
。到目前为止,我找不到 Python 3.6
的解决方案。
我想知道是否有人可以帮助我,因为我根本不了解 ctypes
和 C
编程。
我猜你使用的是 64 位 Python 3.6,所以句柄是 64 位的,你将它们作为 c_int(32 位)传递。
对于 ctypes,最好明确所有参数和 return 类型。以下代码应该适用于 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())
我试图通过在 Python 3.6
中使用 ctypes
来获取存储在剪贴板中的文本。我测试了很多在 Stack 和 GitHub 上找到的解决方案,但它们只适用于 Python 2
到 Python 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
上的相同脚本总是 returns None
。到目前为止,我找不到 Python 3.6
的解决方案。
我想知道是否有人可以帮助我,因为我根本不了解 ctypes
和 C
编程。
我猜你使用的是 64 位 Python 3.6,所以句柄是 64 位的,你将它们作为 c_int(32 位)传递。
对于 ctypes,最好明确所有参数和 return 类型。以下代码应该适用于 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())