最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python實現(xiàn)剪切板實時監(jiān)控方法解析

 更新時間:2019年09月11日 08:46:59   作者:辰冢  
這篇文章主要介紹了基于Python實現(xiàn)剪切板實時監(jiān)控方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

上網(wǎng)瀏覽網(wǎng)頁的時候,看見好的內(nèi)容免不了要使用復(fù)制粘貼,但是我們看到的內(nèi)容、心里想要的內(nèi)容和實際粘貼后的內(nèi)容往往不一致。數(shù)據(jù)的獲取始于復(fù)制,終于粘貼,那么問題來了,在這中間系統(tǒng)做了哪些操作,我們怎么能控制它呢?

人生苦短,我用python,查閱相關(guān)資料之后發(fā)現(xiàn)有很多不一樣的實現(xiàn)方式,如利用內(nèi)置ctypes模塊、tk模塊,第三方模塊如跨平臺的pyperclip模塊、clipboard模塊、pywin.win32clipboard模塊等等,大部分都封裝好了簡潔易用的高級接口,方便我們直接使用。

基于強迫癥的心理,本文分析比較了幾種主流的方式,對他們逐一進(jìn)行源碼分析、讀寫性能實測,最后選擇了讀寫速度最快的一種做出一個實時剪切板監(jiān)控小案例,以供大家參考。

小案例實現(xiàn)的功能如下:

**實時監(jiān)測ctrl+c剪切板寫入事件,去除剪切板中指定字符或文本,如某些文字的后綴 (¬_¬)瞄。**

使用正則對某些文本進(jìn)行智能替換,如將python2格式的代碼轉(zhuǎn)換為python3格式。

方式一:調(diào)用第三方pyperclip模塊

In [1]: import pyperclip
In [2]: data = pyperclip.paste()
In [3]: data
Out[3]: "print 'Hello World'\r\n————————————————\r\n版權(quán)聲明:本文為CSDN博主「...」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。\r\n原文鏈接:https://blog.csdn.net/.../article/details/..."
In [4]: data = data[7:12]
In [5]: pyperclip.copy(data)
In [6]: pyperclip.paste()
Out[6]: 'Hello'

源碼調(diào)用: 內(nèi)置ctypes模塊中的ctypes.windll.user32接口編寫,和pandas包的代碼一致,代碼位置:pandas.io.clipboard.windows,代碼引用如下

import ctypes
windll = ctypes.windll
safeGetClipboardData = CheckedCall(windll.user32.GetClipboardData)
safeGetClipboardData.argtypes = [UINT]
safeGetClipboardData.restype = HANDLE
safeSetClipboardData = CheckedCall(windll.user32.SetClipboardData)
safeSetClipboardData.argtypes = [UINT, HANDLE]
safeSetClipboardData.restype = HANDLE

優(yōu)點: 跨平臺,接口調(diào)用方便簡潔

缺點: 剪切板的數(shù)據(jù)格式只支持utf-8文本,頻繁讀寫速度較慢

方式二:調(diào)用第三方win32clipboard模塊

In [1]: import win32clipboard
 ...:
 ...: def clipboard_get():
 ...: """獲取剪貼板數(shù)據(jù)"""
 ...: win32clipboard.OpenClipboard()
 ...: data = win32clipboard.GetClipboardData()
 ...: win32clipboard.CloseClipboard()
 ...: return data
 ...:
 ...: def clipboard_set(data):
 ...: """設(shè)置剪貼板數(shù)據(jù)"""
 ...: win32clipboard.OpenClipboard()
 ...: win32clipboard.SetClipboardData(13, data)
 ...: win32clipboard.CloseClipboard()
 ...: return True
 ...:
In [2]: data = clipboard_get()
In [3]: data
Out[3]: "print 'Hello World'\r\n————————————————\r\n版權(quán)聲明:本文為CSDN博主「...」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上 原文出處鏈接及本聲明。\r\n原文鏈接:https://blog.csdn.net/.../article/details/..."

In [4]: clipboard_set(data[7:12])
Out[4]: True

In [5]: clipboard_get()
Out[5]: 'Hello'

源碼調(diào)用: C源碼封裝,python接口調(diào)用如下

def GetClipboardData(*args, **kwargs): # real signature unknown 
 pass
def SetClipboardData(*args, **kwargs): # real signature unknown
 pass

優(yōu)點: 原生C封裝讀寫速度最快,支持多種剪切板數(shù)據(jù)格式

缺點: 只適用于windows平臺,高頻率讀寫會報錯需要小心處理,utf-8格式之外的數(shù)據(jù)格式需要熟悉winuser.h庫自行設(shè)計編寫

方法三:調(diào)用內(nèi)置tkinter模塊

In [1]: from tkinter import *
 ...:
 ...: r = Tk()

In [2]: data = r.clipboard_get()

In [3]: data
Out[3]: "print 'Hello World'\n————————————————\n版權(quán)聲明:本文為CSDN博主「...」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文 出處鏈接及本聲明。\n原文鏈接:https://blog.csdn.net/.../article/details/..."

In [4]: r.clipboard_append(data[7:12])

In [5]: r.clipboard_get()
Out[6]: 'Hello'

注意: 在win10系統(tǒng)測試后發(fā)現(xiàn),使用tkinter模塊只能獲取剪切板數(shù)據(jù),不能將數(shù)據(jù)寫入剪切板,外部調(diào)用clipboard_board方法時,系統(tǒng)剪切板進(jìn)程會被tk接管鎖死,此時在其他的應(yīng)用按ctrl+v,粘貼的應(yīng)用會直接處于卡死的狀態(tài),或者粘貼后內(nèi)容為空。

如果還是通過Tk()對象將數(shù)據(jù)寫入剪切板,只能采取下面的方法,設(shè)置延遲銷毀Tk對象,系統(tǒng)剪切板數(shù)據(jù)才會被更新,否則內(nèi)容還是為空(實測如果設(shè)置0.2秒以內(nèi)的頻率讀取,剪切板還是為空,這就很雞肋了):

from tkinter import *
import time
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('some string')
r.update()
time.sleep(.2)
r.update()
r.destroy()

源碼調(diào)用: C源碼封裝,python接口調(diào)用如下

# 讀取剪切板數(shù)據(jù):
_tkinter.tkapp('clipboard', 'get')
# 寫入剪切板數(shù)據(jù):
_tkinter.tkapp('clipboard', 'append')

剪切板讀寫速度測試結(jié)果

實時監(jiān)控小案例:

import win32clipboard
import re
import time
def clipboard_get():
  """獲取剪貼板數(shù)據(jù)"""
  win32clipboard.OpenClipboard()
  data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
  win32clipboard.CloseClipboard()
  return data
def clipboard_set(data):
  """設(shè)置剪貼板數(shù)據(jù)"""
  win32clipboard.OpenClipboard()
  win32clipboard.EmptyClipboard()
  win32clipboard.SetClipboardData(win32clipboard.CF_UNICODETEXT, data)
  win32clipboard.CloseClipboard()
# 初始化替換字符列表,相比于正則使用replace函數(shù)進(jìn)行單字符替換更快
char_list = [('(', '('),
       (')', ')'),
       ('“', '"'),
       ('”', '"'),
       ('‘', '\''),
       (''', '\''),
       ('print ', 'print '),
       ('版權(quán)聲明:本文為CSDN', '版權(quán)聲明:本文為CSDN'),
       ]
# 預(yù)編譯正則替換匹配表達(dá)式
# 匹配python2格式的 print函數(shù)文本
sub_print = re.compile(r'\bprint\s+(.+)')
# 匹配csdn復(fù)制自帶的版權(quán)聲明后綴文本
sub_csdn = re.compile(r'—+\s+版權(quán)聲明:本文為CSDN.*\s+原文鏈接.*')
# 指定場景 sub替換函數(shù):python2格式的 print函數(shù) 替換為python3格式
def sub_fn(s):
  return 'print(' + s.group(1).strip() + ')\r\n'
# 判斷如果沒有要替換的字符則返回None,有則執(zhí)行替換操作,先進(jìn)行字符列表replace,再執(zhí)行reg.sub(sub_fn, txt)
def char_replace_reg_sub(txt):
  new_txt = txt
  # 對字符列表中字符 逐一判斷,如果字符在文本中 則replace替換,如果都不在 則return None,不用再進(jìn)行替換操作
  i = 0
  for old_char, new_char in char_list:
    if old_char in new_txt:
      i += 1
      new_txt = new_txt.replace(old_char, new_char)
  if i == 0:
    return None

  print('-' * 150, '\n【After char replace】:', new_txt)
  # 對指定場景替換 使用正則re.sub
  new_txt = sub_print.sub(sub_fn, new_txt)
  new_txt = sub_csdn.sub('', new_txt)
  print('【After sub replace:】', new_txt)
  return new_txt


def main():
  """后臺腳本:每隔0.2秒,讀取剪切板文本,檢查有無指定字符或字符串,如果有則執(zhí)行替換"""
  # recent_txt 存放最近一次剪切板文本,初始化值只多執(zhí)行一次paste函數(shù)讀取和替換
  recent_txt = clipboard_get()
  replaced_txt = char_replace_reg_sub(recent_txt)
  clipboard_set(recent_txt if replaced_txt is None else replaced_txt)

  while True:
    # txt 存放當(dāng)前剪切板文本
    txt = clipboard_get()

    # 剪切板內(nèi)容和上一次對比如有變動,再進(jìn)行內(nèi)容判斷,判斷后如果發(fā)現(xiàn)有指定字符在其中的話,再執(zhí)行替換
    if txt != recent_txt:
      # print(f'txt:{txt}')
      new_txt = char_replace_reg_sub(txt) # 沒查到要替換的子串,返回None

      if new_txt is not None:
        clipboard_set(new_txt)
        # 更新 recent_txt 為替換之后的文本,便于下次與 txt 剪切板文本對比,判斷內(nèi)容有無更新
        recent_txt = new_txt
    # 檢測間隔(延遲0.2秒)
    time.sleep(0.2)
if __name__ == '__main__':
  main()

運行效果:

-----------------------------------------------------------------------------------------
【Copy text】:

print 'Hello World' \r\n————————————————\r\n版權(quán)聲明:本文為CSDN博主「...」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上 原文出處鏈接及本聲明。\r\n原文鏈接:https://blog.csdn.net/.../article/details/...)
-----------------------------------------------------------------------------------------
【After replace:】:

print('Hello World')
-----------------------------------------------------------------------------------------

參考鏈接:

微軟開發(fā)文檔:https://docs.microsoft.com/zh-cn/windows/win32/dataxchg/using-the-clipboard?redirectedfrom=MSDN#_win32_Copying_Information_to_the_Clipboard

Stack Overflow:https://stackoverflow.com/questions/579687/how-do-i-copy-a-string-to-the-clipboard-on-windows-using-python

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Django零基礎(chǔ)入門之靜態(tài)文件的引用

    Django零基礎(chǔ)入門之靜態(tài)文件的引用

    這篇文章主要介紹了Django零基礎(chǔ)入門之靜態(tài)文件的引用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Flask實現(xiàn)定制日志并輸出到文件

    Flask實現(xiàn)定制日志并輸出到文件

    這篇文章主要為大家學(xué)習(xí)介紹了Flask如何實現(xiàn)定制日志并輸出到文件,文中的示例代碼簡介易懂,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-07-07
  • Django權(quán)限設(shè)置及驗證方式

    Django權(quán)限設(shè)置及驗證方式

    這篇文章主要介紹了Django權(quán)限設(shè)置及驗證方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 16行Python代碼實現(xiàn)微信聊天機器人并自動智能回復(fù)功能

    16行Python代碼實現(xiàn)微信聊天機器人并自動智能回復(fù)功能

    聊天機器人自動智能回復(fù)給我們的生活帶來了極大的便利,尤其在業(yè)務(wù)比較繁忙的時候,智能機器人給我們帶來極大的方便,今天小編教大家一招通過16行代碼實現(xiàn)微信聊天智能機器人,感興趣的朋友一起看看吧
    2022-01-01
  • python實現(xiàn)K折交叉驗證

    python實現(xiàn)K折交叉驗證

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)K折交叉驗證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 詳解Python自建logging模塊

    詳解Python自建logging模塊

    本篇文章給大家詳細(xì)分析了Python自建logging模塊的方法和代碼分享,有需要的朋友參考學(xué)習(xí)下吧。
    2018-01-01
  • 詳解python數(shù)據(jù)結(jié)構(gòu)之棧stack

    詳解python數(shù)據(jù)結(jié)構(gòu)之棧stack

    這篇文章主要介紹了詳解python數(shù)據(jù)結(jié)構(gòu)之棧stack,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Python新手在作用域方面經(jīng)常容易碰到的問題

    Python新手在作用域方面經(jīng)常容易碰到的問題

    這篇文章主要介紹了Python新手在作用域方面經(jīng)常容易碰到的問題,全局變量和局部變量方面的知識在Python學(xué)習(xí)當(dāng)中是基礎(chǔ)中的基礎(chǔ),需要的朋友可以參考下
    2015-04-04
  • Python3實現(xiàn)的騰訊微博自動發(fā)帖小工具

    Python3實現(xiàn)的騰訊微博自動發(fā)帖小工具

    這篇文章主要為大家分享下騰訊微博自動發(fā)帖的Python3代碼,需要的朋友可以參考下
    2013-11-11
  • 使用Python?文件讀取的多種方式(四種方式)

    使用Python?文件讀取的多種方式(四種方式)

    這篇文章主要介紹了Python?文件讀取的4種方式,主要有直接打開就讀方式,用read()打開,用readines()以及用readline()方式,每種方式通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評論

正镶白旗| 江安县| 莱芜市| 通城县| 浪卡子县| 鸡西市| 宣化县| 新宁县| 宽城| 甘肃省| 故城县| 玉环县| 双峰县| 年辖:市辖区| 江口县| 独山县| 和静县| 南宫市| 吴桥县| 沙河市| 富川| 洛川县| 溧阳市| 临颍县| 苏州市| 台北市| 鄂州市| 敦化市| 临潭县| 麟游县| 白银市| 延津县| 石家庄市| 阳朔县| 章丘市| 西城区| 乐业县| 甘南县| 资兴市| 聂荣县| 二连浩特市|