如何写一个脚本检测键盘

wen 实用脚本 2

本文目录导读:

如何写一个脚本检测键盘

  1. Python - keyboard库(最简单)
  2. Python - pynput库(跨平台)
  3. Windows PowerShell(无需额外软件)
  4. JavaScript - 网页版
  5. 完整日志记录版
  6. 安装依赖
  7. 使用建议

我来为您介绍几种检测键盘输入的方法,适用于不同场景:

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

使用建议

  1. 权限要求:Linux系统可能需要root权限
  2. 后台运行:可添加daemonize功能让程序在后台运行
  3. 安全考虑:请确保合法使用,不要用于恶意目的
  4. 性能优化:大批量记录时使用异步写入

根据您的具体需求选择合适的方法,如果只是简单测试,推荐使用 Python keyboard 库;如果需要跨平台支持,建议使用 pynput。

抱歉,评论功能暂时关闭!