Clipboard Monitor (tkinter,windows)

Peter Sutton annannienann at yahoo.co.uk
Fri Aug 24 05:35:05 EDT 2007


Hi. I am an A-level student studying computer science. I have taken it upon myself to learn python. It is now my weapon of choice. I have had a problem trying to creating a clipboard monitor in Windows(XP,Vista) that is linked to a tkinter GUI. I have a perfectly good code for clipboard monitoring, but as soon as it is linked to a tkinter gui, the gui locks when a WM.DRAWCLIPBOARD message is recieved. I am at the point of giving up. If anyone can help or offer an alternative....that is not polling....I would be very happy.  Thanks. Peter

import win32ui, win32clipboard, win32con, win32api, win32gui
from Tkinter import *

def paste():
    win32clipboard.OpenClipboard(0)
    data = win32clipboard.GetClipboardData()
    win32clipboard.CloseClipboard()
    return data


class ClipRecord(object):
    def __init__(self):
        self.gui = Tk()
        self.hPrev = 0
        self.first = True
        self.win = win32ui.CreateFrame()
        self.win.CreateWindow(None,'',win32con.WS_OVERLAPPEDWINDOW)
        self.win.HookMessage(self.OnDrawClipboard,win32con.WM_DRAWCLIPBOARD)
        self.win.HookMessage(self.OnChangeCBChain,win32con.WM_CHANGECBCHAIN)
        self.win.HookMessage(self.OnDestroy,win32con.WM_DESTROY)
        try:
            self.hPrev=win32clipboard.SetClipboardViewer(self.win.GetSafeHwnd())
        except win32api.error, err:
            if win32api.GetLastError () == 0:
                # information that there is no other window in chain
                pass
            else:
                raise
        self.l = Label(self.gui,text="I have losted the will to live")
        self.l.pack()
        self.gui.mainloop()
    def OnChangeCBChain(self, *args):
        msg, wParam, lParam = args[-1][1:4]
        if self.hPrev == wParam:
            # repair the chain
            self.hPrev = lParam
        if self.hPrev:
            # pass the message to the next window in chain
            win32api.SendMessage (self.hPrev, msg, wParam, lParam)

    def OnDrawClipboard(self, *args):
        msg, wParam, lParam = args[-1][1:4]
        if self.first:
            self.first = False
        else:
            self.l["text"] = "Lord be Praised"
            print paste()
        if self.hPrev:
            # pass the message to the next window in chain
            win32api.SendMessage (self.hPrev, msg, wParam, lParam)
    def OnDestroy(self):
        if self.hPrev:
            win32clipboard.ChangeClipboardChain(self.win.GetSafeHwnd(),self.hPrev)
        else:
            win32clipboard.ChangeClipboardChain(self.win.GetSafeHwnd(),0)

if __name__ == "__main__":
    cr = ClipRecord()




      ___________________________________________________________
Yahoo! Answers - Got a question? Someone out there knows the answer. Try it
now.
http://uk.answers.yahoo.com/ 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20070824/4c145ad0/attachment.html>


More information about the Python-list mailing list