选择困难?直接生成pynput快捷键字符串

news2025/1/30 14:40:26
from pynput import keyboard

# 文档:https://pynput.readthedocs.io/en/latest/keyboard.html#monitoring-the-keyboard
# 博客(pynput相关源码):https://blog.csdn.net/qq_39124701/article/details/145230331
# 虚拟键码(十六进制):https://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes

## 虚拟键码页面使用方法
## 1.访问虚拟键码页面, https://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes
## 2.按F6将光标聚焦到地址栏

## 粘贴这行文本 j删除avascript:    document.querySelectorAll("table").forEach((table)=>{if(table.innerText.includes("0x01")){const thead=table.querySelector('thead');const tbody=table.querySelector('tbody');if(thead&&tbody){const th=document.createElement('th');th.textContent=decodeURIComponent('%E5%8D%81%E8%BF%9B%E5%88%B6%E5%80%BC');th.style.width='10%';th.style.textAlign='center';thead.querySelector('tr').insertBefore(th,thead.querySelector('tr').children[2]);tbody.querySelectorAll('tr').forEach(row=>{const td=document.createElement('td');td.style.width='10%';td.style.textAlign='center';const hexValue=row.querySelector('td:nth-child(2)').textContent.trim();const decimalValue=parseInt(hexValue,16);td.textContent=decimalValue;row.insertBefore(td,row.children[2])})}}})

## 4.删除地址栏里的中文和#符号


# 快捷键字符串列表
# 注意:pynput不能识别"<win>"、"<numpad1>"
hotkey_strings = [
    "<ctrl>+a",
    "<ctrl>+<alt>+a",
    "<ctrl>+<shift>+a",
    "<ctrl>+<shift>+<alt>+a",
    "<ctrl>+<cmd>+a",
    "<alt>+a",
    "<shift>+a",
    "<cmd>+a",

    "<ctrl>+~",
    "<ctrl>+<f1>",  # f1到f24
    "<ctrl>+1",
    "<ctrl>+-",
    "<ctrl>+=",
    "<ctrl>+<backspace>",

    "<ctrl>+<tab>",
    "<ctrl>+q",
    "<ctrl>+{",
    "<ctrl>+}",
    "<ctrl>+<enter>",

    "<ctrl>+<caps_lock>",
    "<ctrl>+;",
    "<ctrl>+'",
    # 1.反斜线紧挨着引号会触发转义
    # 2.非原始字符串模式下, 反斜线+空格会触发无效转义
    # 3.pynput无法解析带空格的字符串
    r"<ctrl>+\ ".strip(),
    "<ctrl>+|",

    "<ctrl>+<shift_l>",
    "<ctrl>+,",
    "<ctrl>+.",
    "<ctrl>+/",
    "<ctrl>+<shift_r>",

    "<ctrl>+<cmd_l>",
    "<ctrl>+<alt_l>",
    "<ctrl>+<space>",
    "<ctrl>+<alt_r>",
    "<ctrl>+<cmd_r>",
    "<ctrl>+<menu>",
    "<ctrl_l>+<ctrl_r>",

    "<ctrl>+<insert>",
    "<ctrl>+<delete>",
    "<ctrl>+<home>",
    "<ctrl>+<end>",
    "<ctrl>+<page_up>",
    "<ctrl>+<page_down>",

    "<ctrl>+<up>",
    "<ctrl>+<down>",
    "<ctrl>+<left>",
    "<ctrl>+<right>",

    "<ctrl>+<print_screen>",
    "<ctrl>+<scroll_lock>",
    "<ctrl>+<pause>",
    
    "<ctrl>+<num_lock>",
    # pynput1.7.?不支持小键盘:https://github.com/moses-palmer/pynput/issues/545
    # 但是可以使用解决方案:https://github.com/moses-palmer/pynput/issues/545#issuecomment-2185323984
    "<ctrl>+<96>",   # 小键盘数字0(96是pynput使用的十进制vk码)
    "<ctrl>+<105>",  # 小键盘数字9
    "<ctrl>+<106>",  # 小键盘*
    "<ctrl>+<107>",  # 小键盘+
    "<ctrl>+<109>",  # 小键盘-
    "<ctrl>+<110>",  # 小键盘.
    "<ctrl>+<111>",  # 小键盘/
]

# 随机生成快捷键
def generate_random_hotkey():
    import random
    # 随机选择一个快捷键字符串
    random_hotkey_str = random.choice(hotkey_strings)
    
    # 检查是否包含单个字符,并随机替换为a到z中的某个字符
    if '+' in random_hotkey_str:
        parts = random_hotkey_str.split('+')
        for i, part in enumerate(parts):
            if len(part) == 1 and part.isalpha():
                # 随机选择一个字符
                random_char = chr(random.randint(ord('a'), ord('z')))
                parts[i] = random_char
            elif part.startswith('<f') and part.endswith('>'):
                # 随机选择一个功能键
                random_f_key = f"<f{random.randint(1, 12)}>"
                parts[i] = random_f_key
        random_hotkey_str = '+'.join(parts)
    
    try:
        # 解析快捷键字符串
        parsed_hotkey = keyboard.HotKey.parse(random_hotkey_str)
        print(f"生成的快捷键为: {random_hotkey_str}")
        return parsed_hotkey, random_hotkey_str
    except ValueError as e:
        print(f"解析 '{random_hotkey_str}' 失败: {e}")
        return None, random_hotkey_str


# 测试这些快捷键字符串是否合法
def parse_hotkey_strings():
    # 解析每个快捷键字符串
    for hotkey_str in hotkey_strings:
        try:
            parsed_hotkey = keyboard.HotKey.parse(hotkey_str)
            print(f"\033[1;32m解析 '{hotkey_str}' 结果为: {parsed_hotkey}\033[0m")
        except ValueError as e:
            print(f"\033[1;31m解析 '{hotkey_str}' 失败: {e}\033[0m")

# 测试监听小键盘
def test_numpad_hotkey():
    hotkey_s = '<ctrl>+<105>'
    def on_activate():
        print(f"按下了{hotkey_s}")

    def for_canonical(f):
        return lambda k: (setattr(k, '_scan', None), f(listener.canonical(k)))

    hotkey = keyboard.HotKey(keyboard.HotKey.parse(hotkey_s), on_activate)
    listener = keyboard.Listener(on_press=for_canonical(hotkey.press), on_release=for_canonical(hotkey.release))
    listener.start()
    import time;time.sleep(5)
    listener.stop()
    listener.join()

# 按按键, 输出vk码
def print_vk_on_press():
    def format_key_info(key):
        key_info = f" {key}"
        if hasattr(key, 'char'):
            key_info += f' char:{key.char}'
        if hasattr(key, 'vk'):
            key_info += f' vk:{key.vk}'
        return key_info

    def on_press(key):
        print(format_key_info(key))

    def on_release(key):
        print('{0} released'.format(key))
        if key == keyboard.Key.esc:
            import os;os._exit(0)  # 强行退出, 因为主线程在睡觉
            # return False

    listener = keyboard.Listener(on_press=on_press, on_release=on_release)
    listener.start()
    import time
    time.sleep(10)
    listener.stop()
    listener.join()


if __name__ == "__main__":
    pass
    # 随机生成快捷键字符串
    for i in range(10):
        generate_random_hotkey()
    # 判断快捷键字符串合法性
    # parse_hotkey_strings()
    # 测试监听小键盘
    # test_numpad_hotkey()
    # 按按键,输出vk码
    # print_vk_on_press()



随机
请添加图片描述


测试
请添加图片描述


小键盘
请添加图片描述


vk码
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2284775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode题练习与总结:安装栅栏--587

一、题目描述 给定一个数组 trees&#xff0c;其中 trees[i] [xi, yi] 表示树在花园中的位置。 你被要求用最短长度的绳子把整个花园围起来&#xff0c;因为绳子很贵。只有把 所有的树都围起来&#xff0c;花园才围得很好。 返回恰好位于围栏周边的树木的坐标。 示例 1: 输…

< OS 有关 > 阿里云 几个小时前 使用密钥替换 SSH 密码认证后, 发现主机正在被“攻击” 分析与应对

信息来源&#xff1a; 文件&#xff1a;/var/log/auth.log 因为在 sshd_config 配置文件中&#xff0c;已经定义 LogLevel INFO 部分内容&#xff1a; 2025-01-27T18:18:55.68272708:00 jpn sshd[15891]: Received disconnect from 45.194.37.171 port 58954:11: Bye Bye […

使用八爪鱼爬虫和Web Scraper抓取数据实战案例,附详细教程

最近有不少小伙伴咨询怎么抓取抖音视频或者评论的数据&#xff0c;他们多是自媒体或者商家&#xff0c;想要模仿爆火视频或者分析视频评论区的舆情信息&#xff0c;确实呀&#xff0c;现在抖音是流量高地&#xff0c;淘金的地方&#xff0c;真的是一个值得挖掘的宝藏。当然我一…

海外问卷调查渠道查如何设置:最佳实践+示例

随着经济全球化和一体化进程的加速&#xff0c;企业间的竞争日益加剧&#xff0c;为了获得更大的市场份额&#xff0c;对企业和品牌而言&#xff0c;了解受众群体的的需求、偏好和痛点才是走向成功的关键。而海外问卷调查才是获得受众群体痛点的关键&#xff0c;制作海外问卷调…

【C++数论】880. 索引处的解码字符串|2010

本文涉及知识点 数论&#xff1a;质数、最大公约数、菲蜀定理 LeetCode880. 索引处的解码字符串 给定一个编码字符串 s 。请你找出 解码字符串 并将其写入磁带。解码时&#xff0c;从编码字符串中 每次读取一个字符 &#xff0c;并采取以下步骤&#xff1a; 如果所读的字符是…

从ai产品推荐到利用cursor快速掌握一个开源项目再到langchain手搓一个Text2Sql agent

目录 0. 经验分享&#xff1a;产品推荐 1. 经验分享&#xff1a;提示词优化 2. 经验分享&#xff1a;使用cursor 阅读一篇文章 3. 经验分享&#xff1a;使用cursor 阅读一个完全陌生的开源项目 4. 经验分享&#xff1a;手搓一个text2sql agent &#xff08;使用langchain l…

Blazor-选择循环语句

今天我们来说说Blazor选择语句和循环语句。 下面我们以一个简单的例子来讲解相关的语法&#xff0c;我已经创建好了一个Student类&#xff0c;以此类来进行语法的运用 因为我们需要交互性所以我们将类创建在*.client目录下 if 我们做一个学生信息的显示&#xff0c;Gender为…

appium自动化环境搭建

一、appium介绍 appium介绍 appium是一个开源工具、支持跨平台、用于自动化ios、安卓手机和windows桌面平台上面的原生、移动web和混合应用&#xff0c;支持多种编程语言(python&#xff0c;java&#xff0c;Ruby&#xff0c;Javascript、PHP等) 原生应用和混合应用&#xf…

大数据Hadoop入门2

目录 第三部分&#xff08;Hadoop MapReduce和Hadoop YARN&#xff09; 1.课程内容-大纲-学习目标 2.理解先分再合、分而治之的思想 3.hadoop团队针对MapReduce的设计构思 4.Hadoop MapReduce介绍、阶级划分和进程组成 5.Hadoop MapReduce官方示例-圆周率PI评估 6.Hadoo…

21.Word:小赵-毕业论文排版❗【39】

目录 题目​ NO1.2 NO3.4 NO5.6 NO7.8.9 NO10.11.12 题目 NO1.2 自己的论文当中接收老师的修改&#xff1a;审阅→比较→源文档&#xff1a;考生文件夹&#xff1a;Word.docx→修订的文档&#xff1a;考生文件夹&#xff1a;教师修改→确定→接收→接收所有修订将合并之…

【go语言】并发编程

一、协程、线程、进程 在计算机编程中&#xff0c;进程、线程和协程都是用于并发执行任务的不同概念。他们的区别主要体现在创建、管理和调度的复杂度上&#xff0c;特别是在不同的编程语言中有不同的实现方式。下面是他们的详细区别和在 go 语言中的实现方式。 1.1 进程 定义…

算法1-1 模拟与高精度

目录 一 阶乘数码 二 麦森数 三 模拟题 一 阶乘数码 本题中n<1000,1000的阶乘为以下这么大&#xff0c;远超long的范围 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901…

公式与函数的应用

一 相邻表格相乘 1 也可以复制 打印标题

ShenNiusModularity项目源码学习(7:数据库结构)

ShenNiusModularity项目默认使用mysql数据库&#xff0c;数据库连接字符串放到了ShenNius.Admin. Mvc、ShenNius.Admin.Hosting的appsettings.json文件内。   ShenNiusModularity项目为自媒体内容管理系统&#xff0c;支持常规管理、CMS管理、商城管理等功能&#xff0c;其数…

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion(原理介绍)

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion&#xff08;原理介绍&#xff09; 目录 手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion&#xff08;原理介绍&#xff09;DDPM 原理图Stable Diffusion 原理Stable Diffusion的原理解释Stable Diffusion 和 Diffus…

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)

Understanding Diffusion Models: A Unified Perspective&#xff08;三&#xff09; 文章概括 文章概括 引用&#xff1a; article{luo2022understanding,title{Understanding diffusion models: A unified perspective},author{Luo, Calvin},journal{arXiv preprint arXiv:…

修改maven的编码格式为utf-8

1.maven默认编码为GBK 注:配好MAVEN_HOME的环境变量后,在运行cmd. 打开cmd 运行mvn -v命令即可. 2.修改UTF-8为默认编码. 设置环境变量 变量名 MAVEN_OPTS 变量值 -Xms256m -Xmx512m -Dfile.encodingUTF-8 3.保存,退出cmd.重新打开cmd 运行mvn -v命令即可. 源码获取&…

从AD的原理图自动提取引脚网络的小工具

这里跟大家分享一个我自己写的小软件&#xff0c;实现从AD的原理图里自动找出网络名称和引脚的对应。存成文本方便后续做表格或是使用简单行列编辑生成引脚约束文件&#xff08;如.XDC .UCF .TCL等&#xff09;。 我们在FPGA设计中需要引脚锁定文件&#xff0c;就是指示TOP层…

【数据结构】(1)集合类的认识

一、什么是数据结构 1、数据结构的定义 数据结构就是存储、组织数据的方式&#xff0c;即相互之间存在一种或多种关系的数据元素的集合。 2、学习数据结构的目的 在实际开发中&#xff0c;我们需要使用大量的数据。为了高效地管理这些数据&#xff0c;实现增删改查等操作&…

解决使用Selenium时ChromeDriver版本不匹配问题

在学习Python爬虫过程中如果使用Selenium的时候遇到报错如下session not created: This version of ChromeDriver only supports Chrome version 99… 这说明当前你的chrome驱动版本和浏览器版本不匹配。 例如 SessionNotCreatedException: Message: session not created: This…