Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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 如何使pynput防止某些击键到达特定应用程序?_Python_Winapi_Pynput - Fatal编程技术网

Python 如何使pynput防止某些击键到达特定应用程序?

Python 如何使pynput防止某些击键到达特定应用程序?,python,winapi,pynput,Python,Winapi,Pynput,我想创建一个工具,允许我在不支持它的应用程序()中使用一些Vim风格的命令 例如,如果 当前模式为命令模式和 用户按下按钮w 然后,插入符号应该向右移动一个字符。Scrivener应该接收“向右箭头”信号,而不是w字符 为了实现这一点,我编写了以下代码(基于这两个答案:,): 在命令模式下,每当我在Scrigener中按下按钮w,就会向Scrigener发送两次击键: 退格以删除已键入的w字符 向右箭头移动插入符号 这种方式可以工作,但您可以看到w字符再次显示和删除(请参阅) 如果模式是Co

我想创建一个工具,允许我在不支持它的应用程序()中使用一些Vim风格的命令

例如,如果

  • 当前模式为
    命令
    模式和
  • 用户按下按钮
    w
然后,插入符号应该向右移动一个字符。Scrivener应该接收“向右箭头”信号,而不是
w
字符

为了实现这一点,我编写了以下代码(基于这两个答案:,):

在命令模式下,每当我在Scrigener中按下按钮
w
,就会向Scrigener发送两次击键:

  • 退格以删除已键入的
    w
    字符
  • 向右箭头移动插入符号
  • 这种方式可以工作,但您可以看到
    w
    字符再次显示和删除(请参阅)


    如果模式是
    Command
    ,当前焦点窗口是Scrivener应用程序,如何确保使用
    w
    的按键根本不会到达Scrivener?

    首先需要安装pyHook和pywin32库

    然后通过pyhook监控键盘信息。如果需要截取键盘信息(例如,按w键),则返回False

    最后,通过pythoncom.PumpMessages()实现循环监控。 以下是示例:

    import pyHook
    import pythoncom
    from pynput.keyboard import Key, Listener, Controller
    keyboard = Controller()
    def onKeyboardEvent(event):
        if event.Key == "F12":
            exit()
        print("1")
        if event.Key == 'W':
            print("2")
            print("w released in command mode")
            # Press the right arrow button
            keyboard.press(Key.right)
            return False
    
        print("hook" + event.Key)
        return True
    
    # Collect events until released
    print("Press F12 to exit")
    hm = pyHook.HookManager()
    hm.KeyDown = onKeyboardEvent
    hm.HookKeyboard()
    pythoncom.PumpMessages() 
    

    首先,您需要安装pyHook和pywin32库

    然后通过pyhook监控键盘信息。如果需要截取键盘信息(例如,按w键),则返回False

    最后,通过pythoncom.PumpMessages()实现循环监控。 以下是示例:

    import pyHook
    import pythoncom
    from pynput.keyboard import Key, Listener, Controller
    keyboard = Controller()
    def onKeyboardEvent(event):
        if event.Key == "F12":
            exit()
        print("1")
        if event.Key == 'W':
            print("2")
            print("w released in command mode")
            # Press the right arrow button
            keyboard.press(Key.right)
            return False
    
        print("hook" + event.Key)
        return True
    
    # Collect events until released
    print("Press F12 to exit")
    hm = pyHook.HookManager()
    hm.KeyDown = onKeyboardEvent
    hm.HookKeyboard()
    pythoncom.PumpMessages() 
    
    (低级)键盘挂钩可以过滤掉输入,并防止它被传递到前台线程。即使您使用pynput解决了这个问题,您仍然需要处理此解决方案的基本缺陷(例如,确保内部状态与目标应用程序的模式匹配,或者正确处理键盘输入,如Ctrl+Insert或Shift+w).@IInspectable Re内部状态实际上与目标应用程序的模式匹配:目标应用程序没有模式。该模式仅存在于我的Python应用程序中。一个(低级)键盘挂钩可以过滤掉输入,并防止它被传递到前台线程。即使您使用pynput解决了这个问题,您仍然需要处理此解决方案的基本缺陷(例如,确保内部状态与目标应用程序的模式匹配,或者正确处理键盘输入,如Ctrl+Insert或Shift+w).@IInspectable Re内部状态实际上与目标应用程序的模式匹配:目标应用程序没有模式。该模式仅存在于我的Python应用程序中