用AHK或者c#开发更好,py环境装一遍太烦了。
前言:笔记本触摸板太灵敏(设置调到最低也没用)输入的时候经常误触,于是想着搞个快捷键一键开关触摸板,顺带实现一键打开常用的文件夹,网页的功能。
思路&过程:
在设置开关触摸板时,使用ProcessMonitor捕获注册表改动,然后python快捷键改动对应的值。思路是不错的,折腾了一会,定位到哪些值被更改了(如下图)。
但是在手动更改注册表的时候无法实现开关触摸板的功能,后面查找到这个值是只读的,更改起来挺麻烦的,也怕把注册表改崩了。在查找资料途中,发现微软的一篇文档提到向主机发送win+ctrl+F24时会切换触摸板的状态。
好东西啊,马上写个模拟发送键值试一试。
一次成功,爽!
因为键盘没有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()
效果如下:
那么,怎么让程序开机启动捏?启动后还要把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的解释,不想手打了:
添加到任务计划程序里面,添加方式参考上一篇文章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个月28天前 - 2024/03/30 23:32:08]
用AHK或者c#开发更好,py环境装一遍太烦了。
现在有个问题,当我锁定工作站(电脑)之后再解锁工作站脚本虽然还在系统托盘运行,但监听快捷键按键的功能失效了(通过系统托盘菜单来直接操作还是正常可用),要重新启动脚本才能恢复监听快捷按键,对于这个问题各位大佬有没有什么解决思路?
现在有个问题,当我锁定工作站(电脑)之后再解锁工作站脚本虽然还在系统托盘运行,但监听快捷键按键的功能...
应该有能判断热键是否在被监听的函数吧,判断失效了再重新注册一个就行了
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.")
应该有能判断热键是否在被监听的函数吧,判断失效了再重新注册一个就行了chatgpt答:
刚看了keyboard库的对象没有提供is_alive这个方法
我换了个思路每隔10秒直接重新注册所有热键(还是无效)
我试试异常捕获重新注册热键(还是无效)
用AHK或者c#开发更好,py环境装一遍太烦了。
可用 .NET8新出的AOT技术,native binary连NET运行时都不需要
或者。。。用GO重写。。。
bat脚本的部分也许可以用XXXXXstem()函数来实现?
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。