重新映射Python-Fn锁中的键盘键

问题描述

我用python写了一个简短的脚本来捕获键盘事件并重新映射某些键。这等效于fn锁定键(仅当我的键盘没有此键时,才按Esc键将其打开或关闭)。

也许我应该以完全不同的方式来执行此操作,或者使用Autohotkeys之类的东西,但是我想知道出了什么问题,原因以及解决方法

快速键入的特定实例外,脚本运行良好。例如。如果我将三个手指“滑过”三个键,则最后一个字母通常会发送到系统两次。

我相信这是因为我要求侦听器在脚本向系统发送字符的短暂时间内停止抑制字符。在此时间窗口中按一个键可能会导致我出现问题。

我想到的解决方案是:

  1. 如果不需要重新映射密钥,请将其传递给系统(而不是让脚本再次发送密钥)。为此,我认为侦听器需要避免抑制,但是除了脚本发送的已重映射的对应对象外,我不知道如何防止“待重映射的键”传递到系统。

  2. 区分键盘命令和脚本发送的命令,以便抑制不会停止脚本发送的击键。

为任何建议加油!


from pynput import keyboard
from pynput.keyboard import Controller,KeyCode
c = keyboard.Controller()


keydict={'Key.media_volume_mute':KeyCode.from_vk(0x70),'Key.media_volume_down':KeyCode.from_vk(0x71),'Key.media_volume_up':KeyCode.from_vk(0x72)}
ignore=False
ignoreR=False
function=True

def on_press(key):
    global ignore,function  
        
    #define a break function test: if the character was sent by the script,do not test it again!
    if ignore:        
        ignore = False        
        return

    #Test if the pressed key needs to be remapped (is in the dictionary). If yes,remap it according to the dictionary.
    if str(key) in keydict and function:        
        ignore=True #tell the script  to ignore the next key sent (by the script,below)
        listener._suppress=False
        c.press(keydict[str(key)])
        listener._suppress=True
        return
    else:
        ignore=True #to ensure that the character that we Now send is not going to be tested again.
        listener._suppress=False #allow the character being sent by the script through to the system; do not suppress
        c.press(key)
        listener._suppress=True #immediately stop new characters from being sent to the system ****THIS TIME WINDOW POSES ISUES?****
        if str(key) =='Key.esc' and function==True:
            function=False
            print('Functions Enabled')
        elif str(key) =='Key.esc' and function==False:
            function=True
            print('Functions disabled')
        return


def on_release(key): 
    global ignoreR,function

    if ignoreR:        
        ignoreR = False        
        return
    if str(key) in keydict and function:
        ignoreR=True
        listener._suppress=False
        c.release(keydict[str(key)])
        listener._suppress=True
        return
    else:
        ignoreR=True #to ensure that the character that we allow through is not going to be tested again.
        listener._suppress=False #allow the character through; do not suppress
        c.release(key)
        listener._suppress=True
        return
    


with keyboard.Listener(on_press=on_press,on_release=on_release,suppress=True) as listener:
    listener.join()
    

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)