本文目录导读:

- Python - keyboard库(最简单)
- Python - pynput库(跨平台)
- Windows PowerShell(无需额外软件)
- JavaScript - 网页版
- 完整日志记录版
- 安装依赖
- 使用建议
我来为您介绍几种检测键盘输入的方法,适用于不同场景:
Python - keyboard库(最简单)
import keyboard
import time
def on_key_press(event):
"""检测按键按下"""
if event.event_type == 'down':
print(f"按键 {event.name} 被按下")
def on_key_release(event):
"""检测按键释放"""
if event.event_type == 'up':
print(f"按键 {event.name} 被释放")
# 注册全局事件监听
keyboard.hook(on_key_press)
keyboard.hook(on_key_release)
# 打印提示信息
print("键盘检测已启动,按ESC退出...")
# 保持程序运行
while True:
if keyboard.is_pressed('esc'):
print("退出程序")
break
time.sleep(0.1)
keyboard.unhook_all()
Python - pynput库(跨平台)
from pynput import keyboard
import threading
import time
class KeyboardMonitor:
def __init__(self):
self.listener = None
self.running = True
def on_press(self, key):
"""按键按下时调用"""
try:
# 尝试获取按键字符
print(f"按下: {key.char}")
except AttributeError:
# 特殊键处理
special_keys = {
keyboard.Key.space: "空格",
keyboard.Key.enter: "回车",
keyboard.Key.backspace: "退格",
keyboard.Key.tab: "Tab",
keyboard.Key.esc: "Esc",
keyboard.Key.shift: "Shift",
keyboard.Key.ctrl_l: "Ctrl(左)",
keyboard.Key.ctrl_r: "Ctrl(右)",
keyboard.Key.alt_l: "Alt(左)",
keyboard.Key.alt_r: "Alt(右)"
}
if key in special_keys:
print(f"按下: {special_keys[key]}")
else:
print(f"按下: {key}")
# 检测退出条件
if key == keyboard.Key.esc:
return False # 返回False停止监听
def on_release(self, key):
"""按键释放时调用"""
try:
print(f"释放: {key.char}")
except AttributeError:
print(f"释放: {key}")
def start(self):
"""启动监听"""
with keyboard.Listener(
on_press=self.on_press,
on_release=self.on_release
) as listener:
self.listener = listener
print("键盘监听已启动(按Esc退出)...")
listener.join()
def stop(self):
"""停止监听"""
if self.listener:
self.listener.stop()
# 使用示例
monitor = KeyboardMonitor()
try:
monitor.start()
except KeyboardInterrupt:
monitor.stop()
print("\n程序已停止")
Windows PowerShell(无需额外软件)
# 检测键盘按键的小工具
Add-Type -AssemblyName System.Windows.Forms
$lastKeys = @()
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 100
$button = New-Object System.Windows.Forms.Button
$form = New-Object System.Windows.Forms.Form
$form.Text = "键盘检测工具"
$form.Size = New-Object System.Drawing.Size(400, 300)
$form.StartPosition = "CenterScreen"
$label = New-Object System.Windows.Forms.Label
$label.Text = "按任意键,按ESC退出"
$label.AutoSize = $true
$label.Location = New-Object System.Drawing.Point(100, 100)
$form.Controls.Add($label)
$form.Add_KeyDown({
param($sender, $e)
$keyName = $e.KeyCode.ToString()
$label.Text = "按键: $keyName"
if ($e.KeyCode -eq [System.Windows.Forms.Keys]::Escape) {
$form.Close()
}
})
$form.Add_Shown({
$form.Activate()
})
[System.Windows.Forms.Application]::Run($form)
JavaScript - 网页版
<!DOCTYPE html>
<html>
<head>键盘检测工具</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 20px;
background: #f4f4f4;
}
#key-display {
width: 300px;
padding: 20px;
background: white;
border-radius: 10px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
margin: 20px auto;
text-align: center;
}
.key-detail {
margin: 10px 0;
color: #333;
}
#key-chart {
margin-top: 20px;
text-align: center;
}
</style>
</head>
<body>
<div id="key-display">
<h2>键盘检测日志</h2>
<div id="last-key">等待按键...</div>
</div>
<div id="key-chart"></div>
<script>
const keyLog = [];
document.addEventListener('keydown', (event) => {
const keyName = event.key;
const keyCode = event.keyCode;
const time = new Date().toLocaleTimeString();
console.log(`按键: ${keyName} (代码: ${keyCode}) 时间: ${time}`);
// 更新界面
document.getElementById('last-key').innerHTML = `
<p>按下的键: <strong>${keyName}</strong></p>
<p>键码: ${keyCode}</p>
<p>时间: ${time}</p>
`;
// 记录日志
keyLog.push({
key: keyName,
code: keyCode,
time: time
});
// 按ESC清除记录
if (event.key === 'Escape') {
keyLog.length = 0;
document.getElementById('key-chart').innerHTML = '记录已清除';
}
// 显示最近5次按键
if (keyLog.length > 0) {
document.getElementById('key-chart').innerHTML = `
<h3>最近按键记录:</h3>
${keyLog.slice(-5).map(record =>
`<p>${record.time} - ${record.key} (${record.code})</p>`
).join('')}
`;
}
});
// 防止默认行为
document.addEventListener('keydown', (event) => {
if (event.key === 'F12') {
event.preventDefault();
}
});
</script>
</body>
</html>
完整日志记录版
import keyboard
import json
import time
from datetime import datetime
class KeyboardLogger:
def __init__(self, log_file="key_log.txt"):
self.log_file = log_file
self.log_data = []
self.running = True
def on_event(self, event):
"""处理键盘事件"""
if event.event_type == 'down':
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 记录按键信息
entry = {
"timestamp": timestamp,
"key": event.name,
"scan_code": event.scan_code,
"is_pressed": True
}
self.log_data.append(entry)
self.save_log()
# 实时输出
print(f"[{timestamp}] 按键: {event.name}")
def save_log(self):
"""保存日志到文件"""
try:
with open(self.log_file, 'a', encoding='utf-8') as f:
for entry in self.log_data:
f.write(json.dumps(entry) + "\n")
self.log_data.clear() # 清空已保存的数据
except Exception as e:
print(f"保存日志失败: {e}")
def start(self):
"""启动键盘监听"""
print("键盘监听已启动...")
print("按 Ctrl+C 停止记录")
try:
keyboard.hook(self.on_event)
keyboard.wait('ctrl+c') # 等待Ctrl+C结束
except KeyboardInterrupt:
pass
finally:
keyboard.unhook_all()
print("监听已停止")
# 使用示例
if __name__ == "__main__":
logger = KeyboardLogger("keyboard_log.txt")
logger.start()
安装依赖
# Python keyboard库 pip install keyboard # 或者 # Python pynput库(跨平台更好) pip install pynput
使用建议
- 权限要求:Linux系统可能需要root权限
- 后台运行:可添加daemonize功能让程序在后台运行
- 安全考虑:请确保合法使用,不要用于恶意目的
- 性能优化:大批量记录时使用异步写入
根据您的具体需求选择合适的方法,如果只是简单测试,推荐使用 Python keyboard 库;如果需要跨平台支持,建议使用 pynput。