在 Python 中使用 msvcrt.getch() 读取击键

问题描述 投票:0回答:1

我正在使用

msvcrt.getch()
读取 Python 脚本中的输入。大多数时候它工作正常,但是当按
Shift
加箭头键时,我只收到该箭头键的代码。

有没有办法单独使用

getch()
来读取这些组合键?我更喜欢这样做,而不是使用其他方法,因为我希望编写这个也可以在 Linux 上工作,并且据我所知,除了常规输入之外的任何内容都需要 root 权限。

我认为这可能是因为 PowerShell 读取

Shift + <arrow keys>
来处理文本选择。这是因为 PowerShell 以不同的方式读取输入吗?它有不同的权限吗?

python console-application msvcrt keyboard-input
1个回答
0
投票

Shift
键被视为特殊键。根据文档

读取按键并将结果字符作为字节字符串返回。控制台没有任何回显。如果按键尚不可用,则此调用将阻塞,但不会等待按下 Enter 键。如果按下的键是特殊功能键,则返回“ ”或“\xe0”;下一次调用将返回键码。此功能无法读取 Control-C 按键。

由于getch的功能有限,我们可以使用提供更多信息的

ctypes
库,例如
keystates
。我们使用
& 0x8000
来屏蔽高位,如果它不是零,则按住移位。

这就是它的样子

key = msvcrt.getch()

if key == b'\xe0':  # Escape sequence for special keys
    print("Special key")
    key = msvcrt.getch()
    if key == b'H':
        print("Up arrow")
    elif key == b'P':
        print("Down arrow")
    elif key == b'M':
        print("Right arrow")
    elif key == b'K':
        print("Left arrow")

    # Check for Shift using `GetKeyState` from ctypes
    
    if (ctypes.windll.user32.GetKeyState(0x10) & 0x8000) != 0: 
        print(" with Shift")
        
© www.soinside.com 2019 - 2024. All rights reserved.