如何在Windows上创建一个带有3个参数的全局热键?

前端之家收集整理的这篇文章主要介绍了如何在Windows上创建一个带有3个参数的全局热键?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
就像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建议,那么解决您的问题会更容易.请考虑将来这样做.

猜你在找的Windows相关文章