当前位置: 首页 > article >正文

python通过keyboard库实现模拟/监听键盘

keyboard介绍

如果我们想要通过快捷键,来调用某段代码,我们可以使用python的keyboard库,这个库可以用于发送,挂钩,以及模拟键盘事件等,并且同时支持多种操作系统(但是需要注意的是,在某些系统中,需要以管理员的权限运行才可以使用)

当我们使用这个库的时候,可以:

  • 监听键盘事件:监听全局键盘事件,包括捕获特定键的按下或释放,记录所有键盘输入(这个功能可能很危险,需要小心使用)。
  • 模拟按键输入:模拟按键事件,如按下,释放,或者同时按下多个键等。
  • 热键和快捷键:可以设置热键或快捷键,来执行特定的回调函数。

安装keyboard库,同样需要使用pip:pip install keyboard

keyboard库github地址

 keyboard使用

监听所有键盘输入

import keyboard

def log_keystroke(event):
    print(f"Key {event.name} {'被按下' if event.event_type == 'down' else '被释放'}")

keyboard.hook(log_keystroke)

# 使用esc键来停止监听
keyboard.wait("esc")

可以看到,现在我们所有的按键都会被清清楚楚的记录下来

监听并回放键盘输入

这个功能允许我们先输入内容,然后将所有的输入内容全部记录下来,然后再需要的时候,重新回放(也就是再模拟输入一次)

import keyboard
import time

# 记录按键
keyboard.start_recording()

# 设置记录10秒的键盘输入
time.sleep(10)

events = keyboard.stop_recording()

# 回放记录的按键
keyboard.play(events)

监听特定键的按下和释放

import keyboard

def on_press_reaction(event):
    if event.name == "b":
        print("你为什么要按b?")


keyboard.on_press(on_press_reaction)

keyboard.wait("esc")

监听按键按下:keyboard.on_press()

监听按键释放:keyboard.on_release()

设置热键

import keyboard

def print_message():
    print("你为什么要召唤我?")

# 设置热键,例如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()

实际例子

插入时间信息

一些输入法可能包含一个功能,可以快速插入一段时间信息,例如,将当前时间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")

当然,我们可以对其进行扩展,插入更多的信息,例如,在写文章的时候,同时插入作者信息,联系方式等

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联系方式:{mail}\n创建时间:{current_time}"
    
    keyboard.write(info)

keyboard.add_hotkey("ctrl+b", lambda: write_info("sagegrass", "sagegrass@outlook.com"))
keyboard.wait("esc")

以下信息就是通过按键快速生成的,并非是我手动输入的

在设置热键的时候,一定要注意与原本的快捷键冲突,如果设置的热键冲突,即使程序正确,也可能无法运行,甚至可能因为冲突按键造成许多麻烦。

专注模式

原理:通过热键,操作写入hosts文件,将指定的网站重定向到127.0.0.1,以实现无法访问。再次按下以后,清除这些信息,从而实现继续访问。

 注意,写入hosts以后,不一定能够立即生效,可能需要一定时间的延迟。

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("专注模式已开启,干扰网站已被屏蔽。")
        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("专注模式已关闭,干扰网站可正常访问。")
        is_focus_mode_on = False

keyboard.add_hotkey("ctrl+b", toggle_focus_mode)
keyboard.wait("esc")

风险提示

需要注意的是,由于keyboard库可以实现如读取键盘输入,模拟键盘按键等特殊性质的功能,因此存在一些隐私和安全的风险,需要小心谨慎。

比如说,使用keyboard,可能存在恶意软件的风险,比如说,该库可以用于开发键盘记录器,也就是人们常说的keylogger,这样类型的恶意软件能够记录用户的键盘输入,包括密码或者其他的敏感信息。

因此,我们需要注意:

  • 作为使用者,当使用有包含keyboard库的程序时,要确保代码来源的可靠性,避免使用来历不明的python程序。
  • 作为开发者,我们也需要保证用户的隐私和知情权,要告知软件的行为和权限,更不能尝试去制作和传播键盘记录器。

http://www.kler.cn/a/372708.html

相关文章:

  • 书生大模型实战营 L0 入门岛
  • 提示词高级阶段学习day4.1
  • windows下安装python库wordCloud报错
  • 算法:排序
  • Golang反射在实际开发中的应用场景
  • java:入门基础(1)
  • Spring Security使用
  • 使用three.js 实现 自定义绘制平面的效果
  • Golang 并发编程入门:Goroutine 简介与基础用法
  • 适配器模式:连接不兼容接口的桥梁
  • NVR小程序接入平台/设备EasyNVR多个NVR同时管理多平台级联与上下级对接的高效应用
  • Nginx 的讲解和案例示范
  • SpringBoot+VUE2完成WebSocket聊天(数据入库)
  • ‌MySQL中‌between and的基本用法‌
  • macOS 15 Sequoia dmg格式转用于虚拟机的iso格式教程
  • 【Mac】安装 F5-TTS
  • 阿里云ECS访问GitHub解决方案
  • 公共命名空间,2024年10月的笔记
  • 6款IntelliJ IDEA插件,让Spring和Java开发如虎添翼
  • 微信小程序生成二维码
  • Vue中如何解析docx文件(word文档)
  • 零跑汽车嵌入式面试题汇总及参考答案
  • 如何理解Js中闭包
  • LeetCode 242 - 有效的字母异位词
  • (done) 什么 RPC 协议? remote procedure call 远程调用协议
  • Comsol基于亥姆霍兹声学超材料的通风式低频吸声器