#coding=utf-8 """ Test various clipboard solutions (for Windows). by Cees Timmerman 2014-12-04 v1.1 use locale.getpreferredencoding() 2014-12-05 v1.2 Test emoji. pyperclip (1.5.5) now uses the ctypes code. """ try: from tkinter import Tk except ImportError: from Tkinter import Tk import ctypes, locale, sys #import win32clipboard # http://sourceforge.net/projects/pywin32/files/pywin32/ # http://stackoverflow.com/questions/579687/how-do-i-copy-a-string-to-the-clipboard-on-windows-using-python/4203897 wcscpy = ctypes.cdll.msvcrt.wcscpy OpenClipboard = ctypes.windll.user32.OpenClipboard EmptyClipboard = ctypes.windll.user32.EmptyClipboard GetClipboardData = ctypes.windll.user32.GetClipboardData SetClipboardData = ctypes.windll.user32.SetClipboardData CloseClipboard = ctypes.windll.user32.CloseClipboard CF_UNICODETEXT = 13 GlobalAlloc = ctypes.windll.kernel32.GlobalAlloc GlobalLock = ctypes.windll.kernel32.GlobalLock GlobalUnlock = ctypes.windll.kernel32.GlobalUnlock GMEM_DDESHARE = 0x2000 def copy_c(data): try: # Python 2 if not isinstance(data, unicode): data = data.decode('mbcs') except NameError: if not isinstance(data, str): data = data.decode('mbcs') OpenClipboard(None) EmptyClipboard() hCd = GlobalAlloc(GMEM_DDESHARE, 2 * (len(data) + 1)) pchData = GlobalLock(hCd) wcscpy(ctypes.c_wchar_p(pchData), data) GlobalUnlock(hCd) SetClipboardData(CF_UNICODETEXT, hCd) #ctypes.windll.user32.SetClipboardText(CF_UNICODETEXT, hCd) CloseClipboard() def paste_c(): OpenClipboard(None) handle = GetClipboardData(CF_UNICODETEXT) data = ctypes.c_wchar_p(handle).value # Returns u'' on Windows 8.1: #pcontents = GlobalLock(handle) #data = ctypes.c_wchar_p(pcontents).value if pcontents else u'' #GlobalUnlock(handle) CloseClipboard() return data # win32clipboard (best so far) def copy(text): win32clipboard.OpenClipboard() win32clipboard.EmptyClipboard() #win32clipboard.SetClipboardText(text.encode(locale.getpreferredencoding()), win32clipboard.CF_TEXT) win32clipboard.SetClipboardText(text, win32clipboard.CF_UNICODETEXT) win32clipboard.CloseClipboard() def paste(): win32clipboard.OpenClipboard() #print("Paste using %r" % locale.getpreferredencoding()) # Often 'cp1252'. #data = win32clipboard.GetClipboardData(win32clipboard.CF_TEXT).decode(locale.getpreferredencoding()) data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT) #.decode(locale.getpreferredencoding()) win32clipboard.CloseClipboard() return data # Tkinter def copy_tk(text): "Doesn't stick after process ends on Windows 8.1! Unless win32clipboard.GetClipboardData(win32clipboard.CF_TEXT) is called, but then why use Tk?" r = Tk() r.withdraw() # Hide window from update() r.clipboard_clear() r.clipboard_append(text) #r.update() # Useless. r.destroy() def paste_tk(): r = Tk() r.withdraw() data = r.clipboard_get() r.destroy() return data if __name__ == "__main__": text = "Testing\nthe “clip—board”:" text = "📋." # http://bugs.python.org/issue22999 - Emoji 📋 (\U0001f400) is copied as 🐀 (\U0001f4cb) in Python 3.3+. try: text = text.decode('utf8') # Python 2 needs decode to make a Unicode string. except AttributeError: pass print("%r" % text.encode('utf8')) ''' import clipboard as cb cb.copy(text) data = cb.paste() ''' copy_c(text) data = paste_c() print("%r" % data.encode('utf8', errors='replace')) print("OK" if text == data else "FAIL") try: print(data) except UnicodeEncodeError as er: print(er) print(data.encode('utf8', errors='replace'))