美文网首页
python 操作剪切板

python 操作剪切板

作者: jiang | 来源:发表于2018-01-21 04:41 被阅读2121次

    有时候写脚本的时候会有操作系统剪切板的需求,就是

    • 获取剪切板中的字符串
    • 清空剪切板
    • 向剪切板中写入字符串

    方法包括使用 tkinter , ctypes 这两个 python 标准库, 或者安装 Qt 等第三方库来操作剪切板。


    ctypes 操作剪切板

    先写 windows 系统下 ctypes 库如何操作剪切板吧。ctypes 这个库主要用于调用动态链接函数或共享库,使用起来比较难。

    于是我在 gist 上找了一段代码,是面向对象的写法,还有一两处不兼容 python3 。略作修改后放在简书上,也许能方便有需求的人。虽然我看不太懂这段代码,但好在调用起来还挺简单的,后面会有简单的调用示例。

    '''
    操作剪切板:读取剪切板的字符串;清空剪切板;向剪切板中写入字符串(只能写入 ascii 字符)。
    win10, python3, 
    '''
    from ctypes import *
    
    
    user32 = windll.user32
    kernel32 = windll.kernel32
    def get_clipboard():
        user32.OpenClipboard(c_int(0))
        contents = c_char_p(user32.GetClipboardData(c_int(1))).value
        user32.CloseClipboard()
        return contents
    def empty_clipboard():
        user32.OpenClipboard(c_int(0))
        user32.EmptyClipboard()
        user32.CloseClipboard()
    
    def set_clipboard(data):
        user32.OpenClipboard(c_int(0))
        user32.EmptyClipboard()
        alloc = kernel32.GlobalAlloc(0x2000, len(bytes(data, encoding='utf_8'))+1)
        # alloc = kernel32.GlobalAlloc(0x2000, len(data)+1)
        lock = kernel32.GlobalLock(alloc)
        cdll.msvcrt.strcpy(c_char_p(lock),bytes(data, encoding='utf_8'))
        # cdll.msvcrt.strcpy(c_char_p(lock), data)
        kernel32.GlobalUnlock(alloc)
        user32.SetClipboardData(c_int(1),alloc)
        user32.CloseClipboard()
    
    调用 get_clipboard() 获取剪切板数据
    
    if __name__ == '__main__':
        # 获取剪切板内字符串
        text_raw = get_clipboard()
        print('{0} {1}'.format(text_raw, type(text_raw)))
        
        try:
            text_str = text_raw.decode('utf_8')
            print('{0} {1}'.format(text_str, type(text_str)))
        except:
            print('剪切板为空。') 
    
    
    
    剪切板为空时,输出结果为:
    None <class 'NoneType'>
    剪切板为空。
    
    复制一个字符串后运行上面的测试代码(在这里我复制了 python ),输出结果为:
    b'Python' <class 'bytes'>
    Python <class 'str'>
    
    

    剪切板中无数据时,get_clipboard() 返回 None。
    当剪切板中有数据时,get_clipboard() 将其以 bytes 格式返回;

    使用 text_str = text_raw.decode('utf_8')将 bytes 转化为 str。

    调用 empty_clipboard() 清空剪切板
    if __name__ == '__main__':
        # 清空剪切板
        empty_clipboard()
        text = get_clipboard()
        print(text)
    
    复制一个字符串后运行代码,输出结果为:
    None
    
    调用 set_clipboard() 写入剪切板
    if __name__ == '__main__':
        # 向剪切板内写入 ascii 字符串
        set_clipboard('py!')
        text = get_clipboard()
        print(text)
    
    输出结果为:
    b'py!'
    

    相关

    完整代码在 github 上。
    如果这篇文章有任何错误或不适当的地方,请在评论里指出。或者你有更好的方法,也请写在评论里,感谢!

    相关文章

      网友评论

          本文标题:python 操作剪切板

          本文链接:https://www.haomeiwen.com/subject/rwaxaxtx.html