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

監(jiān)聽(tīng)并回放鍵盤(pán)輸入
這個(gè)功能允許我們先輸入內(nèi)容,然后將所有的輸入內(nèi)容全部記錄下來(lái),然后再需要的時(shí)候,重新回放(也就是再模擬輸入一次)
import keyboard
import time
# 記錄按鍵
keyboard.start_recording()
# 設(shè)置記錄10秒的鍵盤(pán)輸入
time.sleep(10)
events = keyboard.stop_recording()
# 回放記錄的按鍵
keyboard.play(events)
監(jiān)聽(tīng)特定鍵的按下和釋放
import keyboard
def on_press_reaction(event):
if event.name == "b":
print("你為什么要按b?")
keyboard.on_press(on_press_reaction)
keyboard.wait("esc")
監(jiān)聽(tīng)按鍵按下:keyboard.on_press()
監(jiān)聽(tīng)按鍵釋放: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ò)展,插入更多的信息,例如,在寫(xiě)文章的時(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")
以下信息就是通過(guò)按鍵快速生成的,并非是我手動(dòng)輸入的

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

注意,寫(xiě)入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("專注模式已開(kāi)啟,干擾網(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)站可正常訪問(wèn)。")
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)如讀取鍵盤(pán)輸入,模擬鍵盤(pán)按鍵等特殊性質(zhì)的功能,因此存在一些隱私和安全的風(fēng)險(xiǎn),需要小心謹(jǐn)慎。
比如說(shuō),使用keyboard,可能存在惡意軟件的風(fēng)險(xiǎn),比如說(shuō),該庫(kù)可以用于開(kāi)發(fā)鍵盤(pán)記錄器,也就是人們常說(shuō)的keylogger,這樣類(lèi)型的惡意軟件能夠記錄用戶的鍵盤(pán)輸入,包括密碼或者其他的敏感信息。
因此,我們需要注意:
- 作為使用者,當(dāng)使用有包含keyboard庫(kù)的程序時(shí),要確保代碼來(lái)源的可靠性,避免使用來(lái)歷不明的python程序。
- 作為開(kāi)發(fā)者,我們也需要保證用戶的隱私和知情權(quán),要告知軟件的行為和權(quán)限,更不能?chē)L試去制作和傳播鍵盤(pán)記錄器。
以上就是Python通過(guò)keyboard庫(kù)實(shí)現(xiàn)模擬和監(jiān)聽(tīng)鍵盤(pán)的詳細(xì)內(nèi)容,更多關(guān)于Python keyboard模擬和監(jiān)聽(tīng)鍵盤(pán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何對(duì)csv文件數(shù)據(jù)分組,并用pyecharts展示
這篇文章主要介紹了如何對(duì)csv文件數(shù)據(jù)分組,并用pyecharts展示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
解決pyecharts在jupyter notebook中使用報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了解決pyecharts在jupyter notebook中使用報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Python將多個(gè)excel文件合并為一個(gè)文件
這篇文章主要為大家詳細(xì)介紹了Python將多個(gè)excel文件合并為一個(gè)文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
280行Python代碼打造一個(gè)帶語(yǔ)法高亮的IDE
本文詳細(xì)介紹了一個(gè)基于wxPython和Scintilla實(shí)現(xiàn)的桌面IDE的開(kāi)發(fā)過(guò)程,涵蓋語(yǔ)法高亮,多線程處理,跨平臺(tái)I/O讀取等核心技術(shù),感興趣的小伙伴可以了解下2026-05-05
python實(shí)現(xiàn)在字符串中查找子字符串的方法
這篇文章主要介紹了python實(shí)現(xiàn)在字符串中查找子字符串的方法,涉及Python中find方法的相關(guān)使用技巧,需要的朋友可以參考下2015-07-07
將TensorFlow的模型網(wǎng)絡(luò)導(dǎo)出為單個(gè)文件的方法
本篇文章主要介紹了將TensorFlow的網(wǎng)絡(luò)導(dǎo)出為單個(gè)文件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Python的內(nèi)置數(shù)據(jù)類(lèi)型中的數(shù)字
這篇文章主要介紹Python內(nèi)置數(shù)據(jù)類(lèi)型中的數(shù)字(Number),包括整數(shù)(int),小數(shù)(float),復(fù)數(shù)(Complex),布爾類(lèi)型(bool)這幾種數(shù)據(jù)類(lèi)型。本文介紹的都是Python3.x中的數(shù)據(jù)類(lèi)型,需要的朋友請(qǐng)參考下面文章2021-09-09

