82 lines
2.3 KiB
Python
82 lines
2.3 KiB
Python
|
import ctypes
|
||
|
|
||
|
from ctypes.wintypes import BOOL, HWND, HANDLE, HGLOBAL, UINT, LPVOID
|
||
|
from ctypes import c_size_t as SIZE_T
|
||
|
|
||
|
# Credit for code goes to Mark Ransom at https://stackoverflow.com/a/25678113
|
||
|
|
||
|
OpenClipboard = ctypes.windll.user32.OpenClipboard
|
||
|
OpenClipboard.argtypes = HWND,
|
||
|
OpenClipboard.restype = BOOL
|
||
|
EmptyClipboard = ctypes.windll.user32.EmptyClipboard
|
||
|
EmptyClipboard.restype = BOOL
|
||
|
GetClipboardData = ctypes.windll.user32.GetClipboardData
|
||
|
GetClipboardData.argtypes = UINT,
|
||
|
GetClipboardData.restype = HANDLE
|
||
|
SetClipboardData = ctypes.windll.user32.SetClipboardData
|
||
|
SetClipboardData.argtypes = UINT, HANDLE
|
||
|
SetClipboardData.restype = HANDLE
|
||
|
CloseClipboard = ctypes.windll.user32.CloseClipboard
|
||
|
CloseClipboard.restype = BOOL
|
||
|
CF_UNICODETEXT = 13
|
||
|
|
||
|
GlobalAlloc = ctypes.windll.kernel32.GlobalAlloc
|
||
|
GlobalAlloc.argtypes = UINT, SIZE_T
|
||
|
GlobalAlloc.restype = HGLOBAL
|
||
|
GlobalLock = ctypes.windll.kernel32.GlobalLock
|
||
|
GlobalLock.argtypes = HGLOBAL,
|
||
|
GlobalLock.restype = LPVOID
|
||
|
GlobalUnlock = ctypes.windll.kernel32.GlobalUnlock
|
||
|
GlobalUnlock.argtypes = HGLOBAL,
|
||
|
GlobalSize = ctypes.windll.kernel32.GlobalSize
|
||
|
GlobalSize.argtypes = HGLOBAL,
|
||
|
GlobalSize.restype = SIZE_T
|
||
|
|
||
|
GMEM_MOVEABLE = 0x0002
|
||
|
GMEM_ZEROINIT = 0x0040
|
||
|
|
||
|
unicode_type = type(u'')
|
||
|
|
||
|
class Clipboard(object):
|
||
|
|
||
|
def get(self):
|
||
|
return get()
|
||
|
|
||
|
def put(self, text):
|
||
|
return put(text)
|
||
|
|
||
|
def get():
|
||
|
"""
|
||
|
Get the contents of the clipboard.
|
||
|
"""
|
||
|
text = None
|
||
|
OpenClipboard(None)
|
||
|
handle = GetClipboardData(CF_UNICODETEXT)
|
||
|
pcontents = GlobalLock(handle)
|
||
|
size = GlobalSize(handle)
|
||
|
if pcontents and size:
|
||
|
raw_data = ctypes.create_string_buffer(size)
|
||
|
ctypes.memmove(raw_data, pcontents, size)
|
||
|
text = raw_data.raw.decode('utf-16le').rstrip(u'\0')
|
||
|
GlobalUnlock(handle)
|
||
|
CloseClipboard()
|
||
|
return text
|
||
|
|
||
|
def put(s):
|
||
|
"""
|
||
|
Put the given string onto the clipboard.
|
||
|
"""
|
||
|
if not isinstance(s, unicode_type):
|
||
|
s = s.decode('mbcs')
|
||
|
data = s.encode('utf-16le')
|
||
|
OpenClipboard(None)
|
||
|
EmptyClipboard()
|
||
|
handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, len(data) + 2)
|
||
|
pcontents = GlobalLock(handle)
|
||
|
ctypes.memmove(pcontents, data, len(data))
|
||
|
GlobalUnlock(handle)
|
||
|
SetClipboardData(CF_UNICODETEXT, handle)
|
||
|
CloseClipboard()
|
||
|
|
||
|
def copy(s):
|
||
|
put(s)
|