就像Ctl一样,Alt删除
我想编写一个程序,它在python中使用带有3个或更多参数的全局热键.只有当我按下键盘上的所有三个键时才能执行指定的功能.例如alt,windows和F3.
win32con.VK_F3,win32con.MOD_WIN,win32con.VK_F5
这是我想要运行的当前程序,但其输出是:
Traceback (most recent call last): File "C:\Python32\Syntax\hot keys\hotkeys2.py",line 41,in <module> for id,(vk,modifiers) in HOTKEYS.items (): ValueError: too many values to unpack (expected 2)
该程序:
import os import sys import ctypes from ctypes import wintypes import win32con byref = ctypes.byref user32 = ctypes.windll.user32 HOTKEYS = { 1 : (win32con.VK_F3,win32con.VK_F5),2 : (win32con.VK_F4,win32con.MOD_WIN),3 : (win32con.VK_F2,win32con.MOD_WIN) } def handle_win_f3 (): #os.startfile (os.environ['TEMP']) print ("Hello WOrld! F3") def handle_win_f4 (): #user32.PostQuitMessage (0) print ("Hello WOrld! F4") def handle_win_f1_escape (): print("exit") sys.exit() HOTKEY_ACTIONS = { 1 : handle_win_f3,2 : handle_win_f4,3 : handle_win_f1_escape } for id,modifiers) in HOTKEYS.items (): print ("Registering id",id,"for key",vk) if not user32.RegisterHotKey (None,modifiers,vk): print ("Unable to register id",id) try: msg = wintypes.MSG () while user32.GetMessageA (byref (msg),None,0) != 0: if msg.message == win32con.WM_HOTKEY: action_to_take = HOTKEY_ACTIONS.get (msg.wParam) #print(" msg.message == win32con.WM_HOTKEY:") if action_to_take: action_to_take () user32.TranslateMessage (byref (msg)) user32.DispatchMessageA (byref (msg)) finally: for id in HOTKEYS.keys (): user32.UnregisterHotKey (None,id) print("user32.UnregisterHotKey (None,id)")
Registering 3 hotkeys? Possible?
解释如何使用分配一个需要按下的键,然后如果需要按下其中两个键.但是我不会认为该功能仅在同时按下所有功能时执行.我拿了
首先,如果你想要alt,windows和F3,你不需要为HOTKEYS条目使用win32con.VK_F3,win32con.MOD_ALT,win32con.MOD_WIN吗?
但是,使用Win和F5键的修饰符按F3并不是很有意义.
行上的错误:
for id,modifiers) in HOTKEYS.items ():
是因为每个字典条目的值是一个可变长度元组.这是一种处理方法,它也将所有修饰符值按位或一起准备将它们作为单个参数传递给RegisterHotKey().
from functools import reduce for id,values in HOTKEYS.items (): vk,modifiers = values[0],reduce (lambda x,y: x | y,values[1:]) print ("Registering id",vk) if not user32.RegisterHotKey (None,vk): print ("Unable to register id",id)
如果您的代码正确缩进并遵循PEP 8 — Style Guide for Python Code建议,那么解决您的问题会更容易.请考虑将来这样做.