我正在使用
msvcrt.getch()
读取 Python 脚本中的输入。大多数时候它工作正常,但是当按 Shift
加箭头键时,我只收到该箭头键的代码。
有没有办法单独使用
getch()
来读取这些组合键?我更喜欢这样做,而不是使用其他方法,因为我希望编写这个也可以在 Linux 上工作,并且据我所知,除了常规输入之外的任何内容都需要 root 权限。
我认为这可能是因为 PowerShell 读取
Shift + <arrow keys>
来处理文本选择。这是因为 PowerShell 以不同的方式读取输入吗?它有不同的权限吗?
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")