监视 Windows 剪切板

一、先看代码

import win32con,win32gui
import win32clipboard as cb

class MyWindow():
    def __init__(self):
        #注册一个窗口类
        wc = win32gui.WNDCLASS()
        wc.lpszClassName = 'MyWindow'
        wc.hbrBackground = win32con.COLOR_BTNFACE+1 
        wc.lpfnWndProc = self.wndProc
        class_atom=win32gui.RegisterClass(wc)
        #创建窗口
        self.hwnd = win32gui.CreateWindow(
            class_atom, u'窗口标题', win32con.WS_OVERLAPPEDWINDOW,
            win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
            win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
            0,0, 0, None)
        #显示窗口
        #win32gui.ShowWindow(self.hwnd, win32con.SW_SHOWNORMAL)

    #消息处理
    def wndProc(self, hwnd, msg, wParam, lParam):
        if msg == win32con.WM_DESTROY:win32gui.PostQuitMessage(0)
        if msg == win32con.WM_DRAWCLIPBOARD: #当剪切板更新的时候收到这个消息
            cb.OpenClipboard()
            txt = cb.GetClipboardData(cb.CF_UNICODETEXT)
            cb.CloseClipboard()
            print txt
        return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)

        
mw = MyWindow()
cb.SetClipboardViewer(mw.hwnd) #注册为剪切板监听窗口
win32gui.PumpMessages()

分三步实现
1、实现一个windows窗口。这里有详细说明
2、SetClipboardViewer 将这个窗口注册为剪切板监听窗口。MSDN官方说明
3、在剪切板有更新的时候上述窗口将收到 WM_DRAWCLIPBOARD 消息,此时就可以处理剪切板内容了

二、一些改进

        if msg == win32con.WM_DRAWCLIPBOARD: #当剪切板更新的时候收到这个消息
            utxt = None
            btxt = None
            try:
                cb.OpenClipboard() #有时候打不开会出异常
                if cb.IsClipboardFormatAvailable(cb.CF_UNICODETEXT): #判断是否有指定的内容
                    utxt = cb.GetClipboardData(cb.CF_UNICODETEXT)
                if cb.IsClipboardFormatAvailable(cb.CF_TEXT):
                    btxt = cb.GetClipboardData(cb.CF_TEXT)
                cb.CloseClipboard() 
            except:pass 
            
            
            ok = False #依次尝试打印Unicode和字节码,ok是打印成功标志位
            if utxt:
                try:
                    print utxt
                    ok = True
                except:
                    print u'UNICODE打印失败'
                    
            if btxt and not ok:    
                try:
                    print btxt.decode('gbk')
                except:
                    print u'GBK打印失败'   

1、cb.OpenClipboard()打开失败
特别是和Office一起使用的情况下,还不知道什么原因。总之,try一下就好。

2 、cb.GetClipboardData(cb.CF_UNICODETEXT) 发生异常
很多时候剪切板的内容不一定可以作为UNICODE读取,比如当剪切了一个文件或者图片。这就先用cb.IsClipboardFormatAvailable(cb.CF_UNICODETEXT)判断一下。

3、print 出现解码异常
有时候用 cb.GetClipboardData(cb.CF_UNICODETEXT) 获得的内容无法正确的print出来,目前还不知道什么原因,也有可能是这个函数的bug。此时可以换 cb.GetClipboardData(cb.CF_TEXT) 试一试,先取得字节码,再解码为UNICODE。

posted @ 2014-10-12 10:18  大侠柯镇恶  阅读(1822)  评论(0编辑  收藏  举报