蘇州做門(mén)戶網(wǎng)站的公司免費(fèi)注冊(cè)推廣網(wǎng)站
????????Pynput 是一個(gè) Python 第三方庫(kù),它提供了監(jiān)聽(tīng)和控制鍵盤(pán)和鼠標(biāo)事件的功能。使用 pynput,我們可以編寫(xiě)自動(dòng)化腳本,監(jiān)控輸入設(shè)備的活動(dòng),或者實(shí)現(xiàn)一些與鍵盤(pán)和鼠標(biāo)相關(guān)的功能。
一、功能說(shuō)明
????????這段代碼是運(yùn)用pynput
庫(kù)實(shí)現(xiàn)對(duì)鼠標(biāo)和鍵盤(pán)事件的監(jiān)聽(tīng)和處理的一個(gè)完整示例,并在控制臺(tái)中實(shí)時(shí)打印出相關(guān)事件的信息。
- 當(dāng)你移動(dòng)鼠標(biāo)時(shí),程序會(huì)捕獲鼠標(biāo)的移動(dòng)事件,并在控制臺(tái)打印出鼠標(biāo)的當(dāng)前位置,包括橫坐標(biāo)(x)和縱坐標(biāo)(y)。
- ?當(dāng)你按下或釋放鼠標(biāo)的左鍵、右鍵或中鍵時(shí),程序會(huì)捕獲這些按鍵事件,并在控制臺(tái)打印出按鍵的狀態(tài)(按下或釋放)以及鼠標(biāo)當(dāng)前的位置。
- 此外,當(dāng)你按下或釋放鍵盤(pán)上的任意按鍵時(shí),程序同樣會(huì)捕獲這些鍵盤(pán)事件。對(duì)于能夠打印出字符的按鍵(如字母、數(shù)字、標(biāo)點(diǎn)符號(hào)等),程序會(huì)在控制臺(tái)打印出該按鍵對(duì)應(yīng)的字符表示;對(duì)于無(wú)法直接打印出字符的特殊按鍵(如功能鍵、控制鍵等),程序會(huì)打印出按鍵本身的信息。
from pynput import mouse, keyboard def on_mouse_move(x, y): print(f'鼠標(biāo)移動(dòng)到位置: ({x}, {y})') def on_mouse_click(x, y, button, pressed): if pressed: print(f'{button} 按下于位置: ({x}, {y})') else: print(f'{button} 釋放于位置: ({x}, {y})')
def on_mouse_scroll(x, y, dx, dy):# dx 和 dy 表示滾動(dòng)的水平方向和垂直方向的量 # 在大多數(shù)鼠標(biāo)上,只有 dy 會(huì)變化,表示垂直滾動(dòng) print(f'Scrolled at {x}, {y} ({dx}, {dy})') def on_key_press(key): try: print(f'{key.char} 被按下') except AttributeError: print(f'{key} 被按下') def on_key_release(key): try: if key == keyboard.Key.esc:print('結(jié)束監(jiān)聽(tīng),退出!')keyboard_listener.stop()mouse_listener.stop()else :print(f'{key.char} 被釋放') except AttributeError: print(f'{key} 被釋放') # 創(chuàng)建鼠標(biāo)監(jiān)聽(tīng)器
mouse_listener = mouse.Listener(on_move=on_mouse_move, on_click=on_mouse_click,on_scroll=on_mouse_scroll)
mouse_listener.start() # 創(chuàng)建鍵盤(pán)監(jiān)聽(tīng)器,同時(shí)監(jiān)聽(tīng)按下和釋放事件
keyboard_listener = keyboard.Listener(on_press=on_key_press, on_release=on_key_release)
keyboard_listener.start() # 等待監(jiān)聽(tīng)器運(yùn)行,直到用戶手動(dòng)停止
try: mouse_listener.join() keyboard_listener.join()
except KeyboardInterrupt: pass # 捕獲 Ctrl+C 來(lái)停止監(jiān)聽(tīng)器
finally: # 停止監(jiān)聽(tīng)器 mouse_listener.stop() keyboard_listener.stop()
????????它首先導(dǎo)入了?pynput
庫(kù)中的?mouse
和?keyboard
模塊,這兩個(gè)模塊分別用于處理鼠標(biāo)和鍵盤(pán)事件。
????????在代碼中,定義了幾個(gè)回調(diào)函數(shù),這些函數(shù)會(huì)在特定的事件發(fā)生時(shí)被調(diào)用。on_mouse_move
函數(shù)用于處理鼠標(biāo)移動(dòng)事件,當(dāng)鼠標(biāo)在屏幕上移動(dòng)時(shí),它會(huì)打印出鼠標(biāo)當(dāng)前的位置坐標(biāo)。on_mouse_click
函數(shù)則處理鼠標(biāo)點(diǎn)擊事件,它會(huì)根據(jù)鼠標(biāo)按鍵的狀態(tài)(按下或釋放)和點(diǎn)擊位置打印相應(yīng)的信息。on_mouse_scroll
函數(shù)則處理鼠標(biāo)滾動(dòng)事件,它會(huì)打印出滾動(dòng)發(fā)生的位置以及滾動(dòng)的方向和距離。
????????對(duì)于鍵盤(pán)事件,代碼中定義了on_key_press
和on_key_release
兩個(gè)回調(diào)函數(shù),分別處理按鍵按下和釋放的事件。這些函數(shù)能夠捕獲按鍵的字符信息或者特殊按鍵的標(biāo)識(shí),并根據(jù)按鍵的類型打印出相應(yīng)的信息。特別地,當(dāng)檢測(cè)到Esc鍵被按下時(shí),程序會(huì)停止鼠標(biāo)和鍵盤(pán)的監(jiān)聽(tīng),并退出運(yùn)行。
????????在定義了這些回調(diào)函數(shù)之后,代碼創(chuàng)建了鼠標(biāo)監(jiān)聽(tīng)器和鍵盤(pán)監(jiān)聽(tīng)器對(duì)象,并將這些回調(diào)函數(shù)作為參數(shù)傳遞給監(jiān)聽(tīng)器。然后,通過(guò)調(diào)用監(jiān)聽(tīng)器的start
方法,程序開(kāi)始監(jiān)聽(tīng)鼠標(biāo)和鍵盤(pán)事件。在監(jiān)聽(tīng)器運(yùn)行期間,程序會(huì)等待直到用戶手動(dòng)停止監(jiān)聽(tīng)或者發(fā)生異常。當(dāng)用戶按下Ctrl+C時(shí),程序會(huì)捕獲到KeyboardInterrupt
異常,并停止監(jiān)聽(tīng)器運(yùn)行。
????????總體而言,這段代碼充分展示了pynput
庫(kù)在處理輸入設(shè)備事件方面的強(qiáng)大能力,它不僅可以捕獲鼠標(biāo)和鍵盤(pán)的基本操作,還可以對(duì)特殊按鍵和復(fù)雜事件進(jìn)行處理。這對(duì)于開(kāi)發(fā)需要與用戶進(jìn)行交互的應(yīng)用程序來(lái)說(shuō),是一個(gè)非常有用的工具。這段代碼適用于需要監(jiān)控鼠標(biāo)和鍵盤(pán)輸入的應(yīng)用場(chǎng)景,例如自動(dòng)化測(cè)試、用戶行為分析、游戲腳本等。注意,在實(shí)際應(yīng)用中,可能需要處理更多的異常和邊界情況,以確保程序的健壯性。
二、結(jié)構(gòu)說(shuō)明
1. 導(dǎo)入模塊
????????代碼首先導(dǎo)入了pynput
庫(kù)中的mouse
和keyboard
模塊。這兩個(gè)模塊分別提供了對(duì)鼠標(biāo)和鍵盤(pán)事件的監(jiān)聽(tīng)和處理功能,為后續(xù)的代碼實(shí)現(xiàn)提供了基礎(chǔ)。
2. 定義回調(diào)函數(shù)
接著,代碼定義了多個(gè)回調(diào)函數(shù),用于處理各種鼠標(biāo)和鍵盤(pán)事件。這些函數(shù)包括:
on_mouse_move
:處理鼠標(biāo)移動(dòng)事件,打印鼠標(biāo)當(dāng)前位置。on_mouse_click
:處理鼠標(biāo)點(diǎn)擊事件,根據(jù)按鈕狀態(tài)和點(diǎn)擊位置打印信息。on_mouse_scroll
:處理鼠標(biāo)滾動(dòng)事件,打印滾動(dòng)位置和滾動(dòng)量。on_key_press
和on_key_release
:分別處理鍵盤(pán)按鍵按下和釋放事件,打印按鍵信息。這些回調(diào)函數(shù)是代碼的核心部分,它們定義了當(dāng)特定事件發(fā)生時(shí)應(yīng)該執(zhí)行的操作。
3. 創(chuàng)建監(jiān)聽(tīng)器
????????在定義了回調(diào)函數(shù)之后,代碼創(chuàng)建了兩個(gè)監(jiān)聽(tīng)器對(duì)象:mouse_listener
和keyboard_listener
。這兩個(gè)監(jiān)聽(tīng)器分別用于監(jiān)聽(tīng)鼠標(biāo)和鍵盤(pán)事件。在創(chuàng)建監(jiān)聽(tīng)器時(shí),將之前定義的回調(diào)函數(shù)作為參數(shù)傳遞給監(jiān)聽(tīng)器,以便在事件發(fā)生時(shí)調(diào)用這些函數(shù)。
4. 啟動(dòng)監(jiān)聽(tīng)器
????????通過(guò)調(diào)用監(jiān)聽(tīng)器的start
方法,代碼開(kāi)始監(jiān)聽(tīng)鼠標(biāo)和鍵盤(pán)事件。此時(shí),程序會(huì)進(jìn)入等待狀態(tài),直到有事件發(fā)生或者用戶手動(dòng)停止監(jiān)聽(tīng)。
5. 事件處理循環(huán)
????????監(jiān)聽(tīng)器啟動(dòng)后,代碼進(jìn)入了事件處理循環(huán)。在這個(gè)循環(huán)中,程序會(huì)持續(xù)監(jiān)聽(tīng)并處理輸入設(shè)備的事件,直到用戶觸發(fā)退出條件(如按下Esc鍵)。mouse_listener.join()
和keyboard_listener.join()
確保了主線程會(huì)等待監(jiān)聽(tīng)器線程完成后再繼續(xù)執(zhí)行。
6. 異常處理與退出機(jī)制
????????代碼中還包含了異常處理和退出機(jī)制。當(dāng)用戶按下Ctrl+C時(shí),會(huì)觸發(fā)KeyboardInterrupt
異常,代碼通過(guò)捕獲這個(gè)異常來(lái)停止監(jiān)聽(tīng)器并退出程序。此外,當(dāng)檢測(cè)到Esc鍵被按下時(shí),也會(huì)通過(guò)調(diào)用監(jiān)聽(tīng)器的stop
方法來(lái)停止監(jiān)聽(tīng)并退出。