python使用pynput庫操作、監控你的鼠標和鍵盤
楔子
python是一門很神奇的語言,原因在於它有很多的庫可以實現各種意想不到的功能。當然我們這次介紹的庫所實現的功能卻是已經很常見瞭,就是操作、監控你的鼠標和鍵盤。如果你寫過遊戲,那麼即使不用下面即將介紹的庫也可以實現對鼠標、鍵盤的操作以及監控。
當然我們下面介紹庫:pynput,是專門針對鼠標和鍵盤的,至於pygame、pyglet等遊戲框架雖然也提供瞭鼠標、鍵盤的監控事件,但它們畢竟是用來開發遊戲的,還提供瞭創建窗口、圖形繪制、物體的碰撞檢測等等很多復雜的功能。如果隻是單純的操作鼠標和鍵盤,使用這種遊戲框架有點小題大做瞭,下面我們就來看看這個名叫pynput的模塊吧,看看它的使用方法。
鼠標
操作鼠標
鼠標無非就是”點擊按住不放”、”松開”、”雙擊”(針對左右鍵),滑動滾輪,移動鼠標等等,這些功能已經基本上覆蓋百分之八九十的日常使用瞭。至於剩下的一小部分,可能就是打遊戲用到的”側鍵”,但是我們不介紹那麼多,先來看看常用的吧。
from pynput.mouse import Button, Controller # 實例化Controller得到一個可以操作鼠標的對象 mouse = Controller() # mouse.position: 獲取當前鼠標位置。 # 屏幕左上角坐標為(0, 0) 右下角為(屏幕寬度, 屏幕高度) print(f"當前鼠標位置: {mouse.position}") # 當前鼠標位置: (881, 467) # 給mouse.position賦值等於移動鼠標,這裡相當於移動到(100, 100)的位置 # 如果坐標小於0,那麼等於0。如果超出屏幕范圍,那麼等於最大范圍 mouse.position = (100, 100) # 此方法等價於mouse.move(100, 100) print(f"當前鼠標位置: {mouse.position}") # 當前鼠標位置: (100, 100) # 按下左鍵,同理Button.right是右鍵 mouse.press(Button.left) # 松開左鍵 mouse.release(Button.left) # 上面兩行連在一起等於一次單擊。如果上面兩行緊接著再重復一次,那麼整體會實現雙擊的效果 # 因為兩次單擊是連續執行的,沒有等待時間。如果中間來一個time.sleep幾秒,那麼就變成兩次單擊瞭 # 當然鼠標點擊我們有更合適的辦法,使用click函數 # 該函數接收兩個參數:點擊鼠標的哪個鍵、以及點擊次數 # 這裡連續點擊兩次,等於雙擊 mouse.click(Button.right, 2)
還有一個功能比較常見,我們需要拿出來單獨說,是因為這個需要找張圖片來演示。
這種情況我們如果想知道更多內容,需要向下滑動,也就是沿著y軸滑動
from pynput.mouse import Controller mouse = Controller() # 垂直方向、沿著y軸滑動 # 第一個參數是針對水平方向的,暫時不用管,為0則表示不變。 # 第二個參數是針對垂直方向的,大於0表示向下,小於0表示向上 mouse.scroll(0, 2)
我們上面是向下移動兩個step,什麼是step呢?
點擊一次就會移動一個step
同理這個就是在水平方向上移動
from pynput.mouse import Controller mouse = Controller() # 大於0向右,小於0向左 mouse.scroll(3, 0)
可能有人好奇,可不可以水平、垂直兩個方向同時移動呢?答案是不可以,因為這是模擬人來點擊,無非就是效率的問題,所以也要符合常理,因為我們平時用鼠標顯然不可能兩個方向同時移動。
監控鼠標
我們可以使用pynput操作鼠標,同時pynput也支持我們在手動操作鼠標的時候記錄我們做瞭哪些操作,同理後面介紹的鍵盤也是一樣的,都分為操作、監控兩部分。
from pynput.mouse import Listener def on_move(x, y): print(f"鼠標移動到: ({x}, {y})") def on_click(x, y, button, is_press): print(f"鼠標{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() """ 鼠標移動到: (1090, 369) 鼠標移動到: (1090, 368) 鼠標移動到: (1090, 368) 鼠標移動到: (1090, 367) 鼠標Button.left鍵在(1090, 367)處按下 鼠標Button.left鍵在(1090, 367)處松開 滑輪在(1090, 367)處向上滑 """
上面實例化一個Listener時,相當於開啟瞭一個線程,因為Listener這個類繼承自threading.Thread。所以我們調用listener.join()相當於就阻塞在這裡瞭,會一直監控鼠標事件。所以我們需要一個機制來讓它停下來:
from pynput.mouse import Listener, Button def on_move(x, y): print(f"鼠標移動到: ({x}, {y})") def on_click(x, y, button, is_press): if button == Button.right: # 一旦當某個事件返回瞭False,那麼就會停止瞭 # 這裡我們選擇右鍵吧 print("點擊右鍵,停止監控") return False print(f"鼠標{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() """ 鼠標Button.left鍵在(881, 606)處按下 鼠標Button.left鍵在(881, 606)處松開 點擊右鍵,停止監控 """
另外執行的時候,你會發現,程序會一直阻塞在listener.join()處,如果下面還有代碼要怎麼執行呢?
from pynput.mouse import Listener def on_move(x, y): print(f"鼠標移動到: ({x}, {y})") def on_click(x, y, button, is_press): print(f"鼠標{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) # 啟動線程,主線程會繼續向下執行 listener.start() print("執行下面代碼") print(123) # 此外我們也可以不通過讓事件返回False,結束監聽 # 而是就讓它一直監聽,等我們的邏輯執行完畢之後,手動結束監聽 # 結束監聽是通listener.stop() import time time.sleep(3) # 這裡睡3s,相當於執行一段長邏輯瞭,否則子線程還未啟動,就直接被主線程強制stop掉瞭 # 結束監聽 listener.stop() print("程序結束") """ 執行下面代碼 123 鼠標移動到: (850, 525) 鼠標Button.left鍵在(850, 525)處按下 鼠標Button.left鍵在(850, 525)處松開 鼠標Button.right鍵在(850, 525)處按下 鼠標Button.right鍵在(850, 525)處松開 程序結束 """
鍵盤
操作鍵盤也比較簡單,無非也是按下某個鍵、松開某個鍵,或者在按下某個鍵(或者多個)不松開的前提下、按下另一個鍵,下面來操作一下。方法和操作鼠標比較類似:
from pynput.keyboard import Key, Controller # 實例化一個可以操作鍵盤的對象 keyboard = Controller() # 按下a鍵,小寫 keyboard.press("a") # 松開a鍵 keyboard.release("a") # 按下A鍵,大寫 keyboard.press("A") # 松開A鍵 keyboard.release("A") """ 像英文字符、數字等等直接輸入相應的字符即可 但如果是shift、ctrl等鍵,那麼需要調用Key裡面屬性 """ # 按下大寫鍵 keyboard.press(Key.caps_lock) # 松開大寫鍵 keyboard.release(Key.caps_lock)
下面來看看如何在按住某個鍵不放的前提下,按下另外的鍵
from pynput.keyboard import Key, Controller # 實例化一個可以操作鍵盤的對象 keyboard = Controller() # 註意調用的方法,是pressed,不是press # shift有兩個鍵,一個是左邊的、一個是右邊的 with keyboard.pressed(Key.shift_l): keyboard.press("1") keyboard.release("1") """ 上面的結果會輸出一個感嘆號,另外我們鍵盤的上方有數字鍵、右側也有數字鍵。 我們平時輸出感嘆號用的都是shift加上鍵盤上方的數字鍵,用右側的數字鍵會沒有效果 但是對於pynput則沒有區別,都會輸出感嘆號,因為你用鍵盤上方和有方的數字鍵打出來的都是數字 """ # 如果要同時按下多個鍵呢?那就輸入多個鍵即可,細心的老鐵可能發現瞭,這正是pycharm啟動程序的快捷鍵 with keyboard.pressed(Key.shift_l, Key.ctrl_l): keyboard.press(Key.f10)
監控
監控鍵盤使用的方法和監控鼠標非常類似,依舊是實例化一個類Listener
from pynput.keyboard import Key, Listener # 此時的Listener是從keyboard裡面導入的 def on_press(key): # 當按下esc,結束監聽 if key == Key.esc: print(f"你按下瞭esc,監聽結束") return False print(f"你按下瞭{key}鍵") def on_release(key): print(f"你松開瞭{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,監聽結束 """
所以定義函數的方式和操作鼠標也是類似的,該Listener同樣會開啟一個線程。另外這裡的key打印的是’Key.xxx’,我們轉成字符串其實已經可以判斷按下瞭哪個鍵瞭。不過key裡面還是提供瞭方法,讓我們獲取操作的鍵
from pynput.keyboard import Key, Listener def on_press(key): """ 我們之前說按下某個鍵的時候,如果是英文字符、數字這些,直接輸入相應的字符即可 但如果是ctrl、shift這些鍵,需要從keyboard.Key裡面獲取 那麼同理,在這裡我們如果想要獲取具體按下、松開哪個鍵的話,那麼可以調用key.char或者key.name 如果是英文字符、數字這些,調用key.char;如果是ctrl、shift、f1、f12這些鍵,則需要調用key.name """ if key == Key.esc: print(f"你按下瞭esc,監聽結束") return False print(f"你按下瞭{key.char if hasattr(key, 'char') else key.name}鍵") def on_release(key): print(f"你松開瞭{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,監聽結束 """
此時返回的就是普通的鍵的名稱,沒有Key.這個前綴瞭。
以上就是這個模塊的內容瞭,具體怎麼使用可以由你自己決定。另外這個模塊在Linux上也是可以運行的,但前提是必須有顯示器,而公司用的服務器肯定是不帶顯示器的,所以不推薦Linux上使用
以上就是python使用pynput庫操作、監控你的鼠標和鍵盤的詳細內容,更多關於python pynput庫操作監控鼠標鍵盤的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 你知道怎麼用Python監控聊天記錄嗎
- 利用Python寫個摸魚監控進程
- Python實現微信表情包炸群功能
- Python對接PicGo實現圖片自動加水印並上傳操作示例
- 10行Python代碼就能實現的八種有趣功能詳解