您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)怎么在python中使用pynput庫對鼠標(biāo)、鍵盤進(jìn)行監(jiān)控,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
Python是一種跨平臺(tái)的、具有解釋性、編譯性、互動(dòng)性和面向?qū)ο蟮哪_本語言,其最初的設(shè)計(jì)是用于編寫自動(dòng)化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發(fā)獨(dú)立的項(xiàng)目和大型項(xiàng)目。
from pynput.mouse import Button, Controller # 實(shí)例化Controller得到一個(gè)可以操作鼠標(biāo)的對象 mouse = Controller() # mouse.position: 獲取當(dāng)前鼠標(biāo)位置。 # 屏幕左上角坐標(biāo)為(0, 0) 右下角為(屏幕寬度, 屏幕高度) print(f"當(dāng)前鼠標(biāo)位置: {mouse.position}") # 當(dāng)前鼠標(biāo)位置: (881, 467) # 給mouse.position賦值等于移動(dòng)鼠標(biāo),這里相當(dāng)于移動(dòng)到(100, 100)的位置 # 如果坐標(biāo)小于0,那么等于0。如果超出屏幕范圍,那么等于最大范圍 mouse.position = (100, 100) # 此方法等價(jià)于mouse.move(100, 100) print(f"當(dāng)前鼠標(biāo)位置: {mouse.position}") # 當(dāng)前鼠標(biāo)位置: (100, 100) # 按下左鍵,同理Button.right是右鍵 mouse.press(Button.left) # 松開左鍵 mouse.release(Button.left) # 上面兩行連在一起等于一次單擊。如果上面兩行緊接著再重復(fù)一次,那么整體會(huì)實(shí)現(xiàn)雙擊的效果 # 因?yàn)閮纱螁螕羰沁B續(xù)執(zhí)行的,沒有等待時(shí)間。如果中間來一個(gè)time.sleep幾秒,那么就變成兩次單擊了 # 當(dāng)然鼠標(biāo)點(diǎn)擊我們有更合適的辦法,使用click函數(shù) # 該函數(shù)接收兩個(gè)參數(shù):點(diǎn)擊鼠標(biāo)的哪個(gè)鍵、以及點(diǎn)擊次數(shù) # 這里連續(xù)點(diǎn)擊兩次,等于雙擊 mouse.click(Button.right, 2)
還有一個(gè)功能比較常見,我們需要拿出來單獨(dú)說,是因?yàn)檫@個(gè)需要找張圖片來演示。
這種情況我們?nèi)绻胫栏鄡?nèi)容,需要向下滑動(dòng),也就是沿著y軸滑動(dòng)
from pynput.mouse import Controller mouse = Controller() # 垂直方向、沿著y軸滑動(dòng) # 第一個(gè)參數(shù)是針對水平方向的,暫時(shí)不用管,為0則表示不變。 # 第二個(gè)參數(shù)是針對垂直方向的,大于0表示向下,小于0表示向上 mouse.scroll(0, 2)
我們上面是向下移動(dòng)兩個(gè)step,什么是step呢?
點(diǎn)擊一次就會(huì)移動(dòng)一個(gè)step
同理這個(gè)就是在水平方向上移動(dòng)
from pynput.mouse import Controller mouse = Controller() # 大于0向右,小于0向左 mouse.scroll(3, 0)
可能有人好奇,可不可以水平、垂直兩個(gè)方向同時(shí)移動(dòng)呢?答案是不可以,因?yàn)檫@是模擬人來點(diǎn)擊,無非就是效率的問題,所以也要符合常理,因?yàn)槲覀兤綍r(shí)用鼠標(biāo)顯然不可能兩個(gè)方向同時(shí)移動(dòng)。
我們可以使用pynput操作鼠標(biāo),同時(shí)pynput也支持我們在手動(dòng)操作鼠標(biāo)的時(shí)候記錄我們做了哪些操作,同理后面介紹的鍵盤也是一樣的,都分為操作、監(jiān)控兩部分。
from pynput.mouse import Listener def on_move(x, y): print(f"鼠標(biāo)移動(dòng)到: ({x}, {y})") def on_click(x, y, button, is_press): print(f"鼠標(biāo){button}鍵在({x}, {y})處{'按下' if is_press else '松開'}") def on_scroll(x, y, dx, dy): if dx: print(f"滑輪在({x}, {y})處向{'右' if dx > 0 else '左'}滑") else: print(f"滑輪在({x}, {y})處向{'下' if dy > 0 else '上'}滑") with Listener( # 上面函數(shù)名不能變,記得對應(yīng) on_move=on_move, on_click=on_click, on_scroll=on_scroll ) as listener: listener.join() """ 鼠標(biāo)移動(dòng)到: (1090, 369) 鼠標(biāo)移動(dòng)到: (1090, 368) 鼠標(biāo)移動(dòng)到: (1090, 368) 鼠標(biāo)移動(dòng)到: (1090, 367) 鼠標(biāo)Button.left鍵在(1090, 367)處按下 鼠標(biāo)Button.left鍵在(1090, 367)處松開 滑輪在(1090, 367)處向上滑 """
上面實(shí)例化一個(gè)Listener時(shí),相當(dāng)于開啟了一個(gè)線程,因?yàn)長istener這個(gè)類繼承自threading.Thread。所以我們調(diào)用listener.join()相當(dāng)于就阻塞在這里了,會(huì)一直監(jiān)控鼠標(biāo)事件。所以我們需要一個(gè)機(jī)制來讓它停下來:
from pynput.mouse import Listener, Button def on_move(x, y): print(f"鼠標(biāo)移動(dòng)到: ({x}, {y})") def on_click(x, y, button, is_press): if button == Button.right: # 一旦當(dāng)某個(gè)事件返回了False,那么就會(huì)停止了 # 這里我們選擇右鍵吧 print("點(diǎn)擊右鍵,停止監(jiān)控") return False print(f"鼠標(biāo){button}鍵在({x}, {y})處{'按下' if is_press else '松開'}") def on_scroll(x, y, dx, dy): if dx: print(f"滑輪在({x}, {y})處向{'右' if dx > 0 else '左'}滑") else: print(f"滑輪在({x}, {y})處向{'下' if dy > 0 else '上'}滑") with Listener( on_move=on_move, on_click=on_click, on_scroll=on_scroll ) as listener: listener.join() """ 鼠標(biāo)Button.left鍵在(881, 606)處按下 鼠標(biāo)Button.left鍵在(881, 606)處松開 點(diǎn)擊右鍵,停止監(jiān)控 """
另外執(zhí)行的時(shí)候,你會(huì)發(fā)現(xiàn),程序會(huì)一直阻塞在listener.join()處,如果下面還有代碼要怎么執(zhí)行呢?
from pynput.mouse import Listener def on_move(x, y): print(f"鼠標(biāo)移動(dòng)到: ({x}, {y})") def on_click(x, y, button, is_press): print(f"鼠標(biāo){button}鍵在({x}, {y})處{'按下' if is_press else '松開'}") def on_scroll(x, y, dx, dy): if dx: print(f"滑輪在({x}, {y})處向{'右' if dx > 0 else '左'}滑") else: print(f"滑輪在({x}, {y})處向{'下' if dy > 0 else '上'}滑") listener = Listener( on_move=on_move, on_click=on_click, on_scroll=on_scroll) # 啟動(dòng)線程,主線程會(huì)繼續(xù)向下執(zhí)行 listener.start() print("執(zhí)行下面代碼") print(123) # 此外我們也可以不通過讓事件返回False,結(jié)束監(jiān)聽 # 而是就讓它一直監(jiān)聽,等我們的邏輯執(zhí)行完畢之后,手動(dòng)結(jié)束監(jiān)聽 # 結(jié)束監(jiān)聽是通listener.stop() import time time.sleep(3) # 這里睡3s,相當(dāng)于執(zhí)行一段長邏輯了,否則子線程還未啟動(dòng),就直接被主線程強(qiáng)制stop掉了 # 結(jié)束監(jiān)聽 listener.stop() print("程序結(jié)束") """ 執(zhí)行下面代碼 123 鼠標(biāo)移動(dòng)到: (850, 525) 鼠標(biāo)Button.left鍵在(850, 525)處按下 鼠標(biāo)Button.left鍵在(850, 525)處松開 鼠標(biāo)Button.right鍵在(850, 525)處按下 鼠標(biāo)Button.right鍵在(850, 525)處松開 程序結(jié)束 """
操作鍵盤也比較簡單,無非也是按下某個(gè)鍵、松開某個(gè)鍵,或者在按下某個(gè)鍵(或者多個(gè))不松開的前提下、按下另一個(gè)鍵,下面來操作一下。方法和操作鼠標(biāo)比較類似:
from pynput.keyboard import Key, Controller # 實(shí)例化一個(gè)可以操作鍵盤的對象 keyboard = Controller() # 按下a鍵,小寫 keyboard.press("a") # 松開a鍵 keyboard.release("a") # 按下A鍵,大寫 keyboard.press("A") # 松開A鍵 keyboard.release("A") """ 像英文字符、數(shù)字等等直接輸入相應(yīng)的字符即可 但如果是shift、ctrl等鍵,那么需要調(diào)用Key里面屬性 """ # 按下大寫鍵 keyboard.press(Key.caps_lock) # 松開大寫鍵 keyboard.release(Key.caps_lock)
下面來看看如何在按住某個(gè)鍵不放的前提下,按下另外的鍵
from pynput.keyboard import Key, Controller # 實(shí)例化一個(gè)可以操作鍵盤的對象 keyboard = Controller() # 注意調(diào)用的方法,是pressed,不是press # shift有兩個(gè)鍵,一個(gè)是左邊的、一個(gè)是右邊的 with keyboard.pressed(Key.shift_l): keyboard.press("1") keyboard.release("1") """ 上面的結(jié)果會(huì)輸出一個(gè)感嘆號,另外我們鍵盤的上方有數(shù)字鍵、右側(cè)也有數(shù)字鍵。 我們平時(shí)輸出感嘆號用的都是shift加上鍵盤上方的數(shù)字鍵,用右側(cè)的數(shù)字鍵會(huì)沒有效果 但是對于pynput則沒有區(qū)別,都會(huì)輸出感嘆號,因?yàn)槟阌面I盤上方和有方的數(shù)字鍵打出來的都是數(shù)字 """ # 如果要同時(shí)按下多個(gè)鍵呢?那就輸入多個(gè)鍵即可,細(xì)心的老鐵可能發(fā)現(xiàn)了,這正是pycharm啟動(dòng)程序的快捷鍵 with keyboard.pressed(Key.shift_l, Key.ctrl_l): keyboard.press(Key.f10)
監(jiān)控鍵盤使用的方法和監(jiān)控鼠標(biāo)非常類似,依舊是實(shí)例化一個(gè)類Listener
from pynput.keyboard import Key, Listener # 此時(shí)的Listener是從keyboard里面導(dǎo)入的 def on_press(key): # 當(dāng)按下esc,結(jié)束監(jiān)聽 if key == Key.esc: print(f"你按下了esc,監(jiān)聽結(jié)束") return False print(f"你按下了{(lán)key}鍵") def on_release(key): print(f"你松開了{(lán)key}鍵") with Listener(on_press=on_press, on_release=on_release) as listener: listener.join() """ 你按下了'a'鍵 你松開了'a'鍵 你按下了Key.shift鍵 你松開了Key.shift鍵 你按下了Key.right鍵 你松開了Key.right鍵 你按下了Key.down鍵 你松開了Key.down鍵 你按下了esc,監(jiān)聽結(jié)束 """
所以定義函數(shù)的方式和操作鼠標(biāo)也是類似的,該Listener同樣會(huì)開啟一個(gè)線程。另外這里的key打印的是'Key.xxx',我們轉(zhuǎn)成字符串其實(shí)已經(jīng)可以判斷按下了哪個(gè)鍵了。不過key里面還是提供了方法,讓我們獲取操作的鍵
from pynput.keyboard import Key, Listener def on_press(key): """ 我們之前說按下某個(gè)鍵的時(shí)候,如果是英文字符、數(shù)字這些,直接輸入相應(yīng)的字符即可 但如果是ctrl、shift這些鍵,需要從keyboard.Key里面獲取 那么同理,在這里我們?nèi)绻胍@取具體按下、松開哪個(gè)鍵的話,那么可以調(diào)用key.char或者key.name 如果是英文字符、數(shù)字這些,調(diào)用key.char;如果是ctrl、shift、f1、f12這些鍵,則需要調(diào)用key.name """ if key == Key.esc: print(f"你按下了esc,監(jiān)聽結(jié)束") return False print(f"你按下了{(lán)key.char if hasattr(key, 'char') else key.name}鍵") def on_release(key): print(f"你松開了{(lán)key.char if hasattr(key, 'char') else key.name}鍵") with Listener(on_press=on_press, on_release=on_release) as listener: listener.join() """ 你按下了shift鍵 你松開了shift鍵 你按下了a鍵 你松開了a鍵 你按下了esc,監(jiān)聽結(jié)束 """
關(guān)于怎么在python中使用pynput庫對鼠標(biāo)、鍵盤進(jìn)行監(jiān)控就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。