Python通過keyboard庫(kù)實(shí)現(xiàn)模擬和監(jiān)聽鍵盤
keyboard介紹
如果我們想要通過快捷鍵,來(lái)調(diào)用某段代碼,我們可以使用python的keyboard庫(kù),這個(gè)庫(kù)可以用于發(fā)送,掛鉤,以及模擬鍵盤事件等,并且同時(shí)支持多種操作系統(tǒng)(但是需要注意的是,在某些系統(tǒng)中,需要以管理員的權(quán)限運(yùn)行才可以使用)
當(dāng)我們使用這個(gè)庫(kù)的時(shí)候,可以:
- 監(jiān)聽鍵盤事件:監(jiān)聽全局鍵盤事件,包括捕獲特定鍵的按下或釋放,記錄所有鍵盤輸入(這個(gè)功能可能很危險(xiǎn),需要小心使用)。
- 模擬按鍵輸入:模擬按鍵事件,如按下,釋放,或者同時(shí)按下多個(gè)鍵等。
- 熱鍵和快捷鍵:可以設(shè)置熱鍵或快捷鍵,來(lái)執(zhí)行特定的回調(diào)函數(shù)。
安裝keyboard庫(kù),同樣需要使用pip:pip install keyboard
keyboard使用
監(jiān)聽所有鍵盤輸入
import keyboard
def log_keystroke(event):
print(f"Key {event.name} {'被按下' if event.event_type == 'down' else '被釋放'}")
keyboard.hook(log_keystroke)
# 使用esc鍵來(lái)停止監(jiān)聽
keyboard.wait("esc")
可以看到,現(xiàn)在我們所有的按鍵都會(huì)被清清楚楚的記錄下來(lái)

監(jiān)聽并回放鍵盤輸入
這個(gè)功能允許我們先輸入內(nèi)容,然后將所有的輸入內(nèi)容全部記錄下來(lái),然后再需要的時(shí)候,重新回放(也就是再模擬輸入一次)
import keyboard
import time
# 記錄按鍵
keyboard.start_recording()
# 設(shè)置記錄10秒的鍵盤輸入
time.sleep(10)
events = keyboard.stop_recording()
# 回放記錄的按鍵
keyboard.play(events)
監(jiān)聽特定鍵的按下和釋放
import keyboard
def on_press_reaction(event):
if event.name == "b":
print("你為什么要按b?")
keyboard.on_press(on_press_reaction)
keyboard.wait("esc")
監(jiān)聽按鍵按下:keyboard.on_press()
監(jiān)聽按鍵釋放:keyboard.on_release()
設(shè)置熱鍵
import keyboard
def print_message():
print("你為什么要召喚我?")
# 設(shè)置熱鍵,例如alt+b
keyboard.add_hotkey("alt+b", print_message)
keyboard.wait("esc")
添加熱鍵:keyboard.add_hotkey()
清除所有的熱鍵:keyboard.clear_all_hotkeys()
阻止程序直到按鍵:keyboard.wait("esc")
模擬輸入
模擬文字輸入:keyboard.write()
模擬按鍵按下:keyboard.press()
模擬按鍵釋放:keyboard.release()
模擬按鍵按下并釋放:keyboard.send()
實(shí)際例子
插入時(shí)間信息
一些輸入法可能包含一個(gè)功能,可以快速插入一段時(shí)間信息,例如,將當(dāng)前時(shí)間2024-10-30 22:00:00插入到文章中。
import keyboard
import datetime
def write_timestamp():
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
keyboard.write(current_time)
keyboard.add_hotkey("ctrl+b", write_timestamp)
keyboard.wait("esc")
當(dāng)然,我們可以對(duì)其進(jìn)行擴(kuò)展,插入更多的信息,例如,在寫文章的時(shí)候,同時(shí)插入作者信息,聯(lián)系方式等
import keyboard
import datetime
def write_info(name, mail):
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
info = f"作者:{name}\n聯(lián)系方式:{mail}\n創(chuàng)建時(shí)間:{current_time}"
keyboard.write(info)
keyboard.add_hotkey("ctrl+b", lambda: write_info("sagegrass", "sagegrass@outlook.com"))
keyboard.wait("esc")
以下信息就是通過按鍵快速生成的,并非是我手動(dòng)輸入的

在設(shè)置熱鍵的時(shí)候,一定要注意與原本的快捷鍵沖突,如果設(shè)置的熱鍵沖突,即使程序正確,也可能無(wú)法運(yùn)行,甚至可能因?yàn)闆_突按鍵造成許多麻煩。
專注模式
原理:通過熱鍵,操作寫入hosts文件,將指定的網(wǎng)站重定向到127.0.0.1,以實(shí)現(xiàn)無(wú)法訪問。再次按下以后,清除這些信息,從而實(shí)現(xiàn)繼續(xù)訪問。

注意,寫入hosts以后,不一定能夠立即生效,可能需要一定時(shí)間的延遲。
import keyboard
import os
# 工作期間拒絕玩小游戲
blocked_websites = [
"4399.com",
"www.4399.com"
]
hosts_path = r"C:\Windows\System32\drivers\etc\hosts"
redirect_ip = "127.0.0.1"
is_focus_mode_on = False
def toggle_focus_mode():
global is_focus_mode_on
if not is_focus_mode_on:
with open(hosts_path, "a") as file:
for website in blocked_websites:
file.write(f"{redirect_ip} {website}\n")
print("專注模式已開啟,干擾網(wǎng)站已被屏蔽。")
is_focus_mode_on = True
else:
with open(hosts_path, "r+") as file:
lines = file.readlines()
file.seek(0)
for line in lines:
if not any(website in line for website in blocked_websites):
file.write(line)
file.truncate()
print("專注模式已關(guān)閉,干擾網(wǎng)站可正常訪問。")
is_focus_mode_on = False
keyboard.add_hotkey("ctrl+b", toggle_focus_mode)
keyboard.wait("esc")風(fēng)險(xiǎn)提示
需要注意的是,由于keyboard庫(kù)可以實(shí)現(xiàn)如讀取鍵盤輸入,模擬鍵盤按鍵等特殊性質(zhì)的功能,因此存在一些隱私和安全的風(fēng)險(xiǎn),需要小心謹(jǐn)慎。
比如說,使用keyboard,可能存在惡意軟件的風(fēng)險(xiǎn),比如說,該庫(kù)可以用于開發(fā)鍵盤記錄器,也就是人們常說的keylogger,這樣類型的惡意軟件能夠記錄用戶的鍵盤輸入,包括密碼或者其他的敏感信息。
因此,我們需要注意:
- 作為使用者,當(dāng)使用有包含keyboard庫(kù)的程序時(shí),要確保代碼來(lái)源的可靠性,避免使用來(lái)歷不明的python程序。
- 作為開發(fā)者,我們也需要保證用戶的隱私和知情權(quán),要告知軟件的行為和權(quán)限,更不能嘗試去制作和傳播鍵盤記錄器。
以上就是Python通過keyboard庫(kù)實(shí)現(xiàn)模擬和監(jiān)聽鍵盤的詳細(xì)內(nèi)容,更多關(guān)于Python keyboard模擬和監(jiān)聽鍵盤的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python使用open函數(shù)對(duì)文件進(jìn)行處理詳解
今天看了open函數(shù),看到w+ r+ a+ 這種可讀可寫的操作,下面這篇文章主要給大家介紹了關(guān)于python使用open函數(shù)對(duì)文件進(jìn)行處理的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
Python讀取postgresql數(shù)據(jù)庫(kù)詳情
這篇文章主要介紹了Python讀取postgresql數(shù)據(jù)庫(kù)詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
pycharm新建Vue項(xiàng)目的方法步驟(圖文)
這篇文章主要介紹了pycharm新建Vue項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Python實(shí)現(xiàn)獲取當(dāng)前目錄下文件名代碼詳解
這篇文章主要介紹了Python實(shí)現(xiàn)獲取當(dāng)前目錄下文件名,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
跟老齊學(xué)Python之關(guān)于循環(huán)的小伎倆
不管是while還是for,所發(fā)起的循環(huán),在python編程中是經(jīng)常被用到的。特別是for,一般認(rèn)為,它要比while快,而且也容易寫(是否容易,可能因人而異,但是,執(zhí)行時(shí)間快,是的確的),因此在實(shí)踐中,for用的比較多點(diǎn)。2014-10-10
matplotlib畫混淆矩陣與正確率曲線的實(shí)例代碼
混淆矩陣也稱誤差矩陣,是表示精度評(píng)價(jià)的一種標(biāo)準(zhǔn)格式,下面這篇文章主要給大家介紹了關(guān)于matplotlib畫混淆矩陣與正確率曲線的相關(guān)資料,需要的朋友可以參考下2021-06-06
只用40行Python代碼就能寫出pdf轉(zhuǎn)word小工具
今天咱們介紹一個(gè)pdf轉(zhuǎn)word的免費(fèi)小工具,滿足這么一個(gè)不常見但是偶爾會(huì)出來(lái)煩人的需求文中有非常詳細(xì)的代碼示例,對(duì)小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
python實(shí)現(xiàn)隨機(jī)調(diào)用一個(gè)瀏覽器打開網(wǎng)頁(yè)
下面小編就為大家分享一篇python實(shí)現(xiàn)隨機(jī)調(diào)用一個(gè)瀏覽器打開網(wǎng)頁(yè),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-04-04

