抑制pynput的热键组合

发布于 2025-01-25 06:17:39 字数 1112 浏览 5 评论 0 原文

我从 alt+f4 ?

from pynput import keyboard
 
def keyboard_listener():
    global listener
    def on_press(key):
        print('on press', key)

    def on_release(key):
        print('on release', key)
        if key == keyboard.Key.esc:
            return False # This will quit the listener
 
    def win32_event_filter(msg, data):
        if (msg == 257 or msg == 256) and data.vkCode == 112: # Key Down/Up & F1
            print("Suppressing F1 up")
            listener._suppress = True
            # return False # if you return False, your on_press/on_release will not be called
        else:
            listener._suppress = False
        return True
            
    return keyboard.Listener(
        on_press=on_press,
        on_release=on_release,
        win32_event_filter=win32_event_filter,
        suppress=False
    )

listener = keyboard_listener()

if __name__ == '__main__':
    with listener as ml:
        ml.join() 

I found this code from the pynput issues page and it works for suppression of single-key hotkeys. In the filter, only one key is detected. How do I apply this for suppressing key combinations such as Alt+F4?

from pynput import keyboard
 
def keyboard_listener():
    global listener
    def on_press(key):
        print('on press', key)

    def on_release(key):
        print('on release', key)
        if key == keyboard.Key.esc:
            return False # This will quit the listener
 
    def win32_event_filter(msg, data):
        if (msg == 257 or msg == 256) and data.vkCode == 112: # Key Down/Up & F1
            print("Suppressing F1 up")
            listener._suppress = True
            # return False # if you return False, your on_press/on_release will not be called
        else:
            listener._suppress = False
        return True
            
    return keyboard.Listener(
        on_press=on_press,
        on_release=on_release,
        win32_event_filter=win32_event_filter,
        suppress=False
    )

listener = keyboard_listener()

if __name__ == '__main__':
    with listener as ml:
        ml.join() 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寒江雪… 2025-02-01 06:17:39

on_press on_release win32_event_filter 始终返回单个键,因此您需要检查两个按钮是否按下并忽略该操作。可以找到更多详细信息在这里。在这里,我如何抑制该关键组合:

from pynput import keyboard
from pynput.keyboard import Key
import time

altPressed = False

def on_press(key):
    global altPressed
    altPressed = (key == Key.alt_l)
    if key == keyboard.Key.esc:
        keyboardListener.stop()

def win32_event_filter(msg, data):
    global altPressed
    if data.vkCode == 115 and altPressed: # suppress f4 when alt_l pressed
        print("suppressed f4")
        keyboardListener.suppress_event()

def on_release(key):
    global altPressed
    altPressed = (key == Key.alt_l)

keyboardListener = keyboard.Listener(on_press=on_press,  
                                     win32_event_filter=win32_event_filter,
                                     on_release=on_release)

if __name__ == '__main__':
    keyboardListener.start()
    while(keyboardListener.is_alive()):
        time.sleep(1)

The on_press, on_release, and win32_event_filter always return a single key in action so you need to check if both buttons are pressed and ignore that action. More detail can be found here. Here how I can suppressing that key combination:

from pynput import keyboard
from pynput.keyboard import Key
import time

altPressed = False

def on_press(key):
    global altPressed
    altPressed = (key == Key.alt_l)
    if key == keyboard.Key.esc:
        keyboardListener.stop()

def win32_event_filter(msg, data):
    global altPressed
    if data.vkCode == 115 and altPressed: # suppress f4 when alt_l pressed
        print("suppressed f4")
        keyboardListener.suppress_event()

def on_release(key):
    global altPressed
    altPressed = (key == Key.alt_l)

keyboardListener = keyboard.Listener(on_press=on_press,  
                                     win32_event_filter=win32_event_filter,
                                     on_release=on_release)

if __name__ == '__main__':
    keyboardListener.start()
    while(keyboardListener.is_alive()):
        time.sleep(1)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文