当前位置: 首页 > 面试题库 >

如何在Windows上使用3个参数创建全局热键?

柳绪
2023-03-14
问题内容

就像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.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)")

正在注册3个热键?可能? 说明如何使用一种方法,分配一个需要按下的键,然后分配是否需要按下两个键。但是我不会说该功能仅在同时按下所有功能时才执行。我拿了


问题答案:

对于初学者,如果您需要alt,windows和F3,是否不需要使用win32con.VK_F3, win32con.MOD_ALT, win32con.MOD_WINHOTKEYS条目?

但是,F3Win and F5键的修饰符来表示按下并没有什么意义。

错误就行了:

for id, (vk, modifiers) in HOTKEYS.items ():

这是因为每个字典条目的值都是可变长度tuple。这是一种处理所有修饰符值也进行按位 或运算
的方法,以准备将它们作为单个参数传递给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", id, "for key", vk)
    if not user32.RegisterHotKey (None, id, modifiers, vk):
        print ("Unable to register id", id)

如果您的代码正确缩进并遵循PEP
8-Python代码样式指南的
建议,解决问题会更容易。请考虑在将来这样做。



 类似资料:
  • 我需要全局热键支持我的Java应用程序。 我想出了一些代码(大部分是复制的),但它不起作用。 HotkeyManager.java: 用户32。爪哇: msg. java: 它确实注册了热键(当程序运行时,按系统中的“F”键不会产生任何结果),但我从未得到任何到控制台的输出。发生了什么?我也知道jintellitype和jnativehook。我不能使用first,至于second,它总是监听所有

  • 我正在尝试设置JavaFX环境,因此我引用了相应的jar。为了运行代码,我需要在launch.json中使用一些VM参数(“vmArgs”:--module path/Users/adrif/Downloads/javafx-sdk-14.0.2.1/lib--add modules javafx.controls,javafx.fxml”)。我在一个多项目文件夹中工作,因此每次创建一个新项目时,

  • 问题内容: 我正在尝试在文件中创建如下。 问题是我发现了问题 类型“配置”没有成员“窗口” 请让我知道如何解决该问题。 问题答案: 表示该类中有一个对象,事实并非如此。 您将需要与with 一起使用,但这无济于事,因为此窗口实际上并不代表任何现有的窗口,而且它也不是视图控制器。 因此,我建议您将要使用的实际视图控制器传递给该方法: 然后从可使用UIViewController对象的类中调用它。

  • 问题内容: 我有一个全局变量,需要在我的ViewController之间共享。 在Objective-C中,我可以定义静态变量,但是找不到在Swift中定义全局变量的方法。 您知道这样做的方法吗? 问题答案: 来自官方的Swift编程指南: 全局变量是在任何函数,方法,闭包或类型上下文之外定义的变量。全局常数和变量总是延迟计算的。 您可以在任何文件中定义它,也可以在任何位置访问它。因此,您可以在任

  • 问题内容: 如何创建一个Java类实例,以确保整个JVM进程只能使用一次?然后,在该JVM上运行的每个应用程序都应该能够使用该单例实例。 问题答案: 实际上,您可以实现这种单例。在注释中向您描述的问题是可能有多个s 加载类。然后,每个都可以定义一个相同名称的类,该类将错误地假定为唯一。 但是,您可以通过实现单例的访问器来避免这种情况,该访问器显式依赖于检查特定名称的类,该类又包含您的单例。这样,您

  • 问题内容: 在我的android应用程序中,我需要放置可变成员id的位置。问题是,它是从在线API获取的,我需要找到一种存储/检索它的方法 我尝试将其放在自定义类中,但是问题是,如果我取消活动,它将丢失,我还知道有一种方法可以扩展应用程序。 所以我想知道存储全局变量的最佳方法是什么? 我必须实现: 将变量保存在onSaveState上 将其保存在sharepref 手动保存 手动检索 谢谢 更新: