[python-uk] Windows Clipboard Module

Pete Forman petef4+usenet at gmail.com
Tue Jun 28 13:45:38 EDT 2016

John Sampson <jrs.idx at ntlworld.com> writes:

> I am using win32clipboard module with Python 2.7 in Windows 7. I have
> code which uses GetClipboardData() and SetClipboardText(argument).
> Before running the code I copy text into the Windows clipboard from a
> proprietary program. I know that this program adds garbage to the end
> of the string, namely null-value bytes and possibly other invisible
> stuff.
> When I paste the contents of the Windows clipboard into a Tkinter text
> box I get the string obtained by GetClipboardData() although I have
> since run SetClipboardText(argument).
> If I paste the contents of the Windows clipboard at this stage into
> the Boxer text editor I get the string placed by
> SetClipboardText(argument). If I paste into the Tkinter program again,
> or into Vim or into Microsoft Word, I get the string obtained using
> GetClipboardData(). I can repeat this as many times as I like - one
> string into Boxer, the other string into the other programs.
> I deduce that both strings must be in the clipboard at the same time,
> but it depends which program has focus which string is pasted in using
> Control v.
> Is there a way of showing the contents of the clipboard, garbage and
> all? I would like to find a way of making the Windows clipboard behave
> as it is supposed to - new contents overwriting the old.

I don't have access to a Windows PC at the moment but here are a couple
of scripts I wrote 9 years ago to play with the clipboard.

Bear in mind that the clipboard is not just text. It is written to in a
number of formats and is designed that the reader pull off the best,
whatever that might be.

There are a number of clipboard viewer or manager applications available
on Windows. Something to watch out for is that clipboard behaviour may
be affected by adding viewers.

=== clipboardViewer.py:
import win32clipboard

def getClipboardViewer():
    return win32clipboard.GetClipboardViewer()

if __name__ == '__main__':
    print getClipboardViewer()

=== clipboard.py:
import collections
import win32clipboard
import pywintypes

class defaultdict1(collections.defaultdict):  # defaultdict is new in Python 2.5
    def __missing__(self, key):
        value = self.default_factory(key)
        self[key] = value
        return value

def getClipboardFormatName(format):
    try: # succeeds for registered formats
        return win32clipboard.GetClipboardFormatName(format)
    except pywintypes.error:
        return 'Unregistered format: %d' % format

formatName = defaultdict1(getClipboardFormatName)
for s in dir(win32clipboard):
    if s.startswith('CF_'):
        formatName[getattr(win32clipboard, s)] = s
formatName[17] = 'CF_DIBV5'  # since Windows 2000, not in pywin32-210

def getAvailableFormats():
    """Return a list of format numbers available on the clipboard."""
    formats = []
        cf = win32clipboard.EnumClipboardFormats(0)
        while (cf != 0):
            cf = win32clipboard.EnumClipboardFormats(cf)
    return formats

if __name__ == '__main__':
    for f in sorted(getAvailableFormats()):  # sorted is new in Python 2.4
        print '0x%04x %s' % (f, formatName[f])

Pete Forman
(formerly on http://petef.22web.org/payg.html)

More information about the python-uk mailing list