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