Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使Python脚本没有焦点,也要侦听快捷方式(如WIN+;a)_Python_Windows_Keyboard_Keyboard Shortcuts - Fatal编程技术网

即使Python脚本没有焦点,也要侦听快捷方式(如WIN+;a)

即使Python脚本没有焦点,也要侦听快捷方式(如WIN+;a),python,windows,keyboard,keyboard-shortcuts,Python,Windows,Keyboard,Keyboard Shortcuts,我希望Python脚本在后台持续运行,并在按下某个键盘快捷键时执行某些操作,例如WIN+a 我已经阅读了使用pynput的方法和解决方案,但是当窗口/控制台有焦点时,它似乎可以工作并检测按键 问题:如何检测Python中的键盘快捷键,如WIN+a,并在出现时启动函数,即使焦点在其他地方(如浏览器等)? 注意:我的操作系统是Windows。另外,我更希望Python脚本只“注册”监听WIN+A(这是否存在?),而不监听所有按键(否则它或多或少会是一个键盘记录程序,我不希望这样!) 以下是我尝试过

我希望Python脚本在后台持续运行,并在按下某个键盘快捷键时执行某些操作,例如WIN+a

我已经阅读了使用
pynput
的方法和解决方案,但是当窗口/控制台有焦点时,它似乎可以工作并检测按键

问题:如何检测Python中的键盘快捷键,如WIN+a,并在出现时启动函数,即使焦点在其他地方(如浏览器等)?

注意:我的操作系统是Windows。另外,我更希望Python脚本只“注册”监听WIN+A(这是否存在?),而不监听所有按键(否则它或多或少会是一个键盘记录程序,我不希望这样!)


以下是我尝试过的:

import pyHook, pythoncom

def OnKeyboardEvent(event):
    if event.Ascii == 8:  # backspace 
        print('hello')
    return True

hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()

我想避免这样做有两个原因:首先,我发现听所有的按键非常麻烦,其次,这个关于
pyhook
I的常见例子在很多地方都有一个bug:。新版本的PyHook3似乎对Py36-64也不起作用:
pip安装PyHook3
在Windows上失败。

事实上,我错了:
pynput
确实能够全局检测按键,而不仅仅是当前活动的窗口

1) 使用
pynput
以下代码使用WIN+W和WIN+C启动应用程序
notepad


2) 使用
ctypes
win32con
这是受到@fpbhb在评论中引用的启发。它收听WIN+F3和WIN+F4


您正在查找Windows API“RegisterHotKey”。下面是一个将其与Python结合使用的示例:我认为您可以将其作为答案发布到@fpbhb!(可能有示例代码)。您做得比我好;-)+1.
from pynput import keyboard
import subprocess

pressed = set()

COMBINATIONS = [
    {
        "keys": [
            {keyboard.Key.cmd, keyboard.KeyCode(char="w")},
            {keyboard.Key.cmd, keyboard.KeyCode(char="W")},
        ],
        "command": "notepad",
    },
    {
        "keys": [
            {keyboard.Key.cmd, keyboard.KeyCode(char="c")},
            {keyboard.Key.cmd, keyboard.KeyCode(char="C")},
        ],
        "command": "calc",
    },
]

def run(s):
    subprocess.Popen(s)

def on_press(key):
    pressed.add(key)
    print(pressed)
    for c in COMBINATIONS:
        for keys in c["keys"]:
            if keys.issubset(pressed):
                run(c["command"])

def on_release(key):
    if key in pressed:
        pressed.remove(key)

with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()
import os, sys
import ctypes
from ctypes import wintypes
import win32con

def handle_win_f3():
    os.startfile(os.environ["TEMP"])

def handle_win_f4():
    ctypes.windll.user32.PostQuitMessage(0)

HOTKEYS = [
    {"keys": (win32con.VK_F3, win32con.MOD_WIN), "command": handle_win_f3},
    {"keys": (win32con.VK_F4, win32con.MOD_WIN), "command": handle_win_f4},
]

for i, h in enumerate(HOTKEYS):
    vk, modifiers = h["keys"]
    print("Registering id", i, "for key", vk)
    if not ctypes.windll.user32.RegisterHotKey(None, i, modifiers, vk):
        print("Unable to register id", i)
try:
    msg = wintypes.MSG()
    while ctypes.windll.user32.GetMessageA(ctypes.byref(msg), None, 0, 0) != 0:
        if msg.message == win32con.WM_HOTKEY:
            HOTKEYS[msg.wParam]["command"]()
        ctypes.windll.user32.TranslateMessage(ctypes.byref(msg))
        ctypes.windll.user32.DispatchMessageA(ctypes.byref(msg))
finally:
    for i, h in enumerate(HOTKEYS):
        ctypes.windll.user32.UnregisterHotKey(None, i)