所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
自动化脚本之Python自定义快捷键并系统托盘自启动
全桥整流2024/03/30原创 秋名山最速传说 IP:新加坡
中文摘要
本文介绍了一种使用Python脚本和快捷键实现笔记本触摸板的一键开关功能的方法。通过发送特定键值组合,实现触摸板的开关,并附带一键打开常用文件夹和网页的功能。作者还设计了一个系统托盘图标来美化程序,并通过批处理脚本和任务计划程序实现了程序的开机启动和隐藏运行。
Abstract
This article presents a method to toggle the laptop touchpad on and off with a single hotkey using a Python script. By sending a specific key combination, the touchpad is toggled, and additional features include opening commonly used folders and web pages with hotkeys. The author also designed a system tray icon to enhance the appearance of the program and used a batch script and Task Scheduler to achieve automatic startup and hidden operation of the program.
关键词
Python脚本自定义快捷键脚本开机自启动

前言:笔记本触摸板太灵敏(设置调到最低也没用)输入的时候经常误触,于是想着搞个快捷键一键开关触摸板,顺带实现一键打开常用的文件夹,网页的功能。


思路&过程:

在设置开关触摸板时,使用ProcessMonitor捕获注册表改动,然后python快捷键改动对应的值。思路是不错的,折腾了一会,定位到哪些值被更改了(如下图)。

image.png

但是在手动更改注册表的时候无法实现开关触摸板的功能,后面查找到这个值是只读的,更改起来挺麻烦的,也怕把注册表改崩了。在查找资料途中,发现微软的一篇文档提到向主机发送win+ctrl+F24时会切换触摸板的状态。

image.png

好东西啊,马上写个模拟发送键值试一试。

一次成功,爽!

因为键盘没有F24,得通过模拟键值发送,并且要自定义按键来发送这个按键组合,我使用的是ctrl+alt+o,下面的代码注意下XXXXXXXeep(0.5),要等松开再发送。否则实际发送的可能不是你想要的按键组合。

def reverse_touchpad():
    time.sleep(0.5)
    #这里的休眠0.5秒很重要
    #当你按下快捷键的时候还没来得及松开就发送键值会导致发送的按键组合是:按下的按键+要发送的按键
    controller = Controller()
    # 按下按键
    controller.press(Key.ctrl_l)
    controller.press(Key.cmd)
    controller.press(Key.f24)  # 注意: Key.f24可能不在所有环境中都受支持
    controller.release(Key.f24)
    controller.release(Key.cmd)
    controller.release(Key.ctrl_l)

下面的代码是创建系统托盘图标,隐藏到系统托盘里面,好看一点。

def create_image():
    # 加载一个图像文件作为图标
    image_path = 'C:\杂\杂图\cat.png'  # 替换为你的图像文件路径
    image = Image.open(image_path)
    return image

def setup_tray_icon():
    # 创建系统托盘图标
    icon('Autolab', create_image(), menu=menu(
        item('反转触摸板', reverse_touchpad),
        item('打开百度网盘文件夹', lambda: open_folder('C:/百度网盘')),
        item('打开杂文件夹', lambda: open_folder('C:/杂')),
        item('打开C盘目录', lambda: open_folder('C:')),
        item('打开QQ邮箱', open_qq_email),
        item('喵~你真的要离开我了吗', lambda icon, item: icon.stop())
    )).run()

效果如下:

image.png

那么,怎么让程序开机启动捏?启动后还要把python的黑框给隐藏捏?并且我使用了conda的虚拟环境。

先新建一个.bat ,set path替换成你自己的虚拟环境,然后替换成你自己的.py路径

@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~0"" h",0)(window.close)&&exit
:begin
set path=C:\Users\lyl\.conda\envs\autolab;C:\Users\lyl\.conda\envs\autolab\Scripts
python C:\Users\lyl\Desktop\hot_key\hot_key.py
pause

上面的代码我直接给出GPT4的解释,不想手打了:

image.png

添加到任务计划程序里面,添加方式参考上一篇文章Win10任务计划程序#930417,但是请注意,触发器要更改一下,改成启动时触发,并且如果程序已运行那里的值不用改,默认值就行(这个根据自己的需要来更改就行)。


hot_XXXXXX完整代码:

import os
import threading
import time
import webbrowser
import sys
import keyboard  
from PIL import Image
from pynput.keyboard import Key, Controller
from pystray import Icon as icon, Menu as menu, MenuItem as item

# 快捷键操作定义
touchpad_flag = 'ctrl+alt+o'
baidu_floder = 'ctrl+alt+b'
other_floder = 'ctrl+alt+z'
c_floder = 'ctrl+alt+c'
open_qq_email_flag = 'ctrl+alt+q'

# 全局变量用于存储系统托盘图标对象
tray_icon = None

def reverse_touchpad():
    time.sleep(0.5)
    controller = Controller()
    # 按下按键
    controller.press(Key.ctrl_l)
    controller.press(Key.cmd)
    controller.press(Key.f24)  # 注意: Key.f24可能不在所有环境中都受支持
    controller.release(Key.f24)
    controller.release(Key.cmd)
    controller.release(Key.ctrl_l)

def open_folder(folder_path):
    os.system(f'start {folder_path}')

def open_qq_email():
    url = 'https://mail.qq.com'
    webbrowser.open(url)

def create_image():
    # 加载一个图像文件作为图标
    image_path = 'C:\杂\杂图\cat.png'  # 替换为你的图像文件路径
    image = Image.open(image_path)
    return image

def setup_tray_icon():
    global tray_icon
    # 创建系统托盘图标
    tray_icon = icon('Autolab', create_image(), menu=menu(
        item('开关触摸板', reverse_touchpad),
        item('打开百度网盘文件夹', lambda: open_folder('C:/百度网盘')),
        item('打开杂文件夹', lambda: open_folder('C:/杂')),
        item('打开C盘目录', lambda: open_folder('C:')),
        item('打开QQ邮箱', open_qq_email),
        item('喵~你真的要离开我了吗૮₍ ˃ ⤙ ˂ ₎ა', lambda icon, item: icon.stop())
    ))
    tray_icon.run()

def exit_program():
    if tray_icon is not None:
        tray_icon.stop()
    sys.exit()

# 使用独立线程运行系统托盘图标,以避免阻塞快捷键监听
tray_thread = threading.Thread(target=setup_tray_icon)
tray_thread.start()

# 使用keyboard监听快捷键
keyboard.add_hotkey(touchpad_flag, reverse_touchpad)
keyboard.add_hotkey(baidu_floder, lambda: open_folder('C:/百度网盘'))
keyboard.add_hotkey(other_floder, lambda: open_folder('C:/杂'))
keyboard.add_hotkey(open_qq_email_flag, open_qq_email)
keyboard.add_hotkey(c_floder, lambda: open_folder('C:'))
keyboard.add_hotkey('ctrl+alt+k', exit_program)

参考文章:XXXXXXXXXXXXXXXXXXXXt/qq_41699621/article/details/110630446

ps:欢迎各位提建议和意见,前5有kcb

[修改于 7个月26天前 - 2024/03/30 23:32:08]

来自:计算机科学 / 软件综合严肃内容:教程/课程
8
5
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
大仙
7个月26天前 IP:广东
930648

用AHK或者c#开发更好,py环境装一遍太烦了。

+0.5
科创币
全桥整流
2024-03-30
AHK是不错,可惜GPT整不出来能用的代码,不能快速开发
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
全桥整流作者
7个月26天前 修改于 7个月26天前 IP:新加坡
930663

现在有个问题,当我锁定工作站(电脑)之后再解锁工作站脚本虽然还在系统托盘运行,但监听快捷键按键的功能失效了(通过系统托盘菜单来直接操作还是正常可用),要重新启动脚本才能恢复监听快捷按键,对于这个问题各位大佬有没有什么解决思路?


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
章鱼wheat
7个月26天前 IP:江西
930664
引用大仙发表于1楼的内容
用AHK或者c#开发更好,py环境装一遍太烦了。

直接用 pyinstaller 或者 nuitka 打包一下就行了


+0.5
科创币
全桥整流
2024-04-16
好思路
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
章鱼wheat
7个月26天前 IP:江西
930665
引用全桥整流发表于2楼的内容
现在有个问题,当我锁定工作站(电脑)之后再解锁工作站脚本虽然还在系统托盘运行,但监听快捷键按键的功能...

应该有能判断热键是否在被监听的函数吧,判断失效了再重新注册一个就行了

chatgpt答:

touchpad_flag = "ctrl+alt+t"
hotkey = keyboard.add_hotkey(touchpad_flag, reverse_touchpad)
# 检查热键是否还在监听中
if hotkey.is_alive():    
print("Hotkey is currently listening.")else:    print("Hotkey is not listening.")
引用
评论
2
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
全桥整流作者
7个月25天前 修改于 7个月25天前 IP:美国
930690
引用章鱼wheat发表于4楼的内容
应该有能判断热键是否在被监听的函数吧,判断失效了再重新注册一个就行了chatgpt答:

刚看了keyboard库的对象没有提供is_alive这个方法

我换了个思路每隔10秒直接重新注册所有热键(还是无效)

我试试异常捕获重新注册热键(还是无效)


引用
评论(2)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
celeron533
7个月20天前 IP:上海
930880
引用大仙发表于1楼的内容
用AHK或者c#开发更好,py环境装一遍太烦了。

可用 .NET8新出的AOT技术,native binary连NET运行时都不需要

或者。。。用GO重写。。。

+0.5
科创币
全桥整流
2024-04-16
谢谢
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
落云
5个月23天前 IP:辽宁
932520

bat脚本的部分也许可以用XXXXXstem()函数来实现?

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
落云
5个月23天前 IP:辽宁
932521

我认为开机启动也可以写完py后用pyinstaller无命令行模式打包成exe(pyinstaller -onefile -noconsole XXXXXXXXXXXX),然后把exe文件放在启动项文件夹里


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
全桥整流
进士 学者 机友 笔友
文章
26
回复
280
学术分
1
2020/01/26注册,9时35分前活动

秋名山最速传说!

主体类型:个人
所属领域:无
认证方式:身份证号
IP归属地:广东
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}