用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