146 lines
4.6 KiB
Python
146 lines
4.6 KiB
Python
|
# win32clipboardDemo.py
|
||
|
#
|
||
|
# Demo/test of the win32clipboard module.
|
||
|
|
||
|
import win32con
|
||
|
from pywin32_testutil import str2bytes # py3k-friendly helper
|
||
|
from win32clipboard import *
|
||
|
|
||
|
if not __debug__:
|
||
|
print("WARNING: The test code in this module uses assert")
|
||
|
print("This instance of Python has asserts disabled, so many tests will be skipped")
|
||
|
|
||
|
cf_names = {}
|
||
|
# Build map of CF_* constants to names.
|
||
|
for name, val in list(win32con.__dict__.items()):
|
||
|
if name[:3] == "CF_" and name != "CF_SCREENFONTS": # CF_SCREEN_FONTS==CF_TEXT!?!?
|
||
|
cf_names[val] = name
|
||
|
|
||
|
|
||
|
def TestEmptyClipboard():
|
||
|
OpenClipboard()
|
||
|
try:
|
||
|
EmptyClipboard()
|
||
|
assert (
|
||
|
EnumClipboardFormats(0) == 0
|
||
|
), "Clipboard formats were available after emptying it!"
|
||
|
finally:
|
||
|
CloseClipboard()
|
||
|
|
||
|
|
||
|
def TestText():
|
||
|
OpenClipboard()
|
||
|
try:
|
||
|
text = "Hello from Python"
|
||
|
text_bytes = str2bytes(text)
|
||
|
SetClipboardText(text)
|
||
|
got = GetClipboardData(win32con.CF_TEXT)
|
||
|
# CF_TEXT always gives us 'bytes' back .
|
||
|
assert got == text_bytes, "Didnt get the correct result back - '%r'." % (got,)
|
||
|
finally:
|
||
|
CloseClipboard()
|
||
|
|
||
|
OpenClipboard()
|
||
|
try:
|
||
|
# CF_UNICODE text always gives unicode objects back.
|
||
|
got = GetClipboardData(win32con.CF_UNICODETEXT)
|
||
|
assert got == text, "Didnt get the correct result back - '%r'." % (got,)
|
||
|
assert type(got) == str, "Didnt get the correct result back - '%r'." % (got,)
|
||
|
|
||
|
# CF_OEMTEXT is a bytes-based format.
|
||
|
got = GetClipboardData(win32con.CF_OEMTEXT)
|
||
|
assert got == text_bytes, "Didnt get the correct result back - '%r'." % (got,)
|
||
|
|
||
|
# Unicode tests
|
||
|
EmptyClipboard()
|
||
|
text = "Hello from Python unicode"
|
||
|
text_bytes = str2bytes(text)
|
||
|
# Now set the Unicode value
|
||
|
SetClipboardData(win32con.CF_UNICODETEXT, text)
|
||
|
# Get it in Unicode.
|
||
|
got = GetClipboardData(win32con.CF_UNICODETEXT)
|
||
|
assert got == text, "Didnt get the correct result back - '%r'." % (got,)
|
||
|
assert type(got) == str, "Didnt get the correct result back - '%r'." % (got,)
|
||
|
|
||
|
# Close and open the clipboard to ensure auto-conversions take place.
|
||
|
finally:
|
||
|
CloseClipboard()
|
||
|
|
||
|
OpenClipboard()
|
||
|
try:
|
||
|
# Make sure I can still get the text as bytes
|
||
|
got = GetClipboardData(win32con.CF_TEXT)
|
||
|
assert got == text_bytes, "Didnt get the correct result back - '%r'." % (got,)
|
||
|
# Make sure we get back the correct types.
|
||
|
got = GetClipboardData(win32con.CF_UNICODETEXT)
|
||
|
assert type(got) == str, "Didnt get the correct result back - '%r'." % (got,)
|
||
|
got = GetClipboardData(win32con.CF_OEMTEXT)
|
||
|
assert got == text_bytes, "Didnt get the correct result back - '%r'." % (got,)
|
||
|
print("Clipboard text tests worked correctly")
|
||
|
finally:
|
||
|
CloseClipboard()
|
||
|
|
||
|
|
||
|
def TestClipboardEnum():
|
||
|
OpenClipboard()
|
||
|
try:
|
||
|
# Enumerate over the clipboard types
|
||
|
enum = 0
|
||
|
while 1:
|
||
|
enum = EnumClipboardFormats(enum)
|
||
|
if enum == 0:
|
||
|
break
|
||
|
assert IsClipboardFormatAvailable(
|
||
|
enum
|
||
|
), "Have format, but clipboard says it is not available!"
|
||
|
n = cf_names.get(enum, "")
|
||
|
if not n:
|
||
|
try:
|
||
|
n = GetClipboardFormatName(enum)
|
||
|
except error:
|
||
|
n = "unknown (%s)" % (enum,)
|
||
|
|
||
|
print("Have format", n)
|
||
|
print("Clipboard enumerator tests worked correctly")
|
||
|
finally:
|
||
|
CloseClipboard()
|
||
|
|
||
|
|
||
|
class Foo:
|
||
|
def __init__(self, **kw):
|
||
|
self.__dict__.update(kw)
|
||
|
|
||
|
def __cmp__(self, other):
|
||
|
return cmp(self.__dict__, other.__dict__)
|
||
|
|
||
|
def __eq__(self, other):
|
||
|
return self.__dict__ == other.__dict__
|
||
|
|
||
|
|
||
|
def TestCustomFormat():
|
||
|
OpenClipboard()
|
||
|
try:
|
||
|
# Just for the fun of it pickle Python objects through the clipboard
|
||
|
fmt = RegisterClipboardFormat("Python Pickle Format")
|
||
|
import pickle
|
||
|
|
||
|
pickled_object = Foo(a=1, b=2, Hi=3)
|
||
|
SetClipboardData(fmt, pickle.dumps(pickled_object))
|
||
|
# Now read it back.
|
||
|
data = GetClipboardData(fmt)
|
||
|
loaded_object = pickle.loads(data)
|
||
|
assert pickle.loads(data) == pickled_object, "Didnt get the correct data!"
|
||
|
|
||
|
print("Clipboard custom format tests worked correctly")
|
||
|
finally:
|
||
|
CloseClipboard()
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
TestEmptyClipboard()
|
||
|
TestText()
|
||
|
TestCustomFormat()
|
||
|
TestClipboardEnum()
|
||
|
# And leave it empty at the end!
|
||
|
TestEmptyClipboard()
|