就像Ctl,Alt+delete
我想写一个程序,它在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.MOD_WIN, 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, (vk, modifiers) in HOTKEYS.items ():
print ("Registering id", id, "for key", vk)
if not user32.RegisterHotKey (None, id, modifiers, vk):
print ("Unable to register id", id)
try:
msg = wintypes.MSG ()
while user32.GetMessageA (byref (msg), None, 0, 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? 说明如何使用“指定一个需要按下的键”,以及是否需要按下其中两个键。但是我不认为这个函数只在同时按下所有键的情况下才执行。我拿走了
对于任何对细节感兴趣的人和一个更详细的关于这个主题的例子,我最近编写了一个简短的程序来演示win32con提供的热键函数。程序允许您通过命令行指定和测试任何热键:
请注意,此程序仅用于演示目的,因为程序的一部分(例如exec函数)不应在生产环境中使用。还要注意,使用这种方法,您将无法覆盖内置热键(如WIN+E等),它们将被忽略,并且仍然执行内置功能(如打开资源管理器)。
另一种方式(由@martineau提供)
以下是如何在不使用
exec()
的情况下构建转换映射:首先,如果您想要alt、windows和F3,难道不需要使用
win32con.VK_F3, win32con.MOD_ALT, win32con.MOD_WIN
作为HOTKEYS
条目吗?然而,用Win和F5键的修饰符来表示按下F3并没有实际意义。
行上的错误:
因为每个字典条目的值都是可变长度
tuple
。这里有一种方法来处理同时按位或将所有修饰符值放在一起,以准备将它们作为单个参数传递给RegisterHotKey()
。如果代码缩进正确并遵循PEP 8 -- Style Guide for Python Code建议,那么处理问题会更容易。今后请考虑这样做。
相关问题 更多 >
编程相关推荐