python - `getwch` 返回的键码是什么?
问题描述
我msvcrt.getwch
用来在面向 Windows 的 Python 中进行交互式提示。
文档说:
读取按键并将结果字符作为字节字符串返回。控制台没有回显任何内容。如果按键不可用,此调用将阻塞,但不会等待 Enter 被按下。如果按下的键是特殊功能键,则返回 '\000' 或 '\xe0';下一次调用将返回键码。使用此功能无法读取 Control-C 按键。
我发现 F10 使用前者\x00D
,而 F11 使用后者\xe0\x85
。
但是,这并没有说明键码是什么。这很重要,因为我没有\xe0
键 (à) 以及其他键,因此无法测试输入此值的输出。
额外的上下文
例如,我尝试通过两种方式将此键粘贴到提示符中。
- CTRL-v - 输入 keycode
\x16
。这是ASCII中的同步空闲键。[1](这是我输入的组合键。) 右键单击(在 PS 中粘贴) - 结果只是
\xe0
被输入。我不确定 Power Shell 和 Visual C++ 是否允许我粘贴转义序列,或者这是对该键的实际处理。
鉴于这msvcrt
似乎是 Visual C++ 的包装,我也查看了该文档。
_getch 和 _getwch 函数从控制台读取单个字符而不回显该字符。这些函数都不能用于读取 CTRL+C。读取功能键或方向键时,每个功能必须调用两次;第一次调用返回 0 或 0xE0,第二次调用返回实际的键码。
这也没有说明键码是什么。
我在网上查过,但我只能找到有关虚拟键码的信息,但是这说 F10 是\x79
,F11 是\x7A
。由于这个函数没有返回这些值,我知道它不是指这些键码。
解决方案
将仅在 Visual c++ 的帮助下对此做出响应。
函数getwch
将返回扫描码而不是虚拟键码。因此对虚拟键码的引用是无效的。
另外,根据 MSDN的 _getch、_getwch文档,在读取功能键或箭头键时,每个功能必须调用两次;第一次调用返回 0 或 0xE0,第二次调用返回实际的键码。
以下代码将返回有效的扫描码:
#include<stdio.h>
#include <ctype.h>
int main()
{
wchar_t ch = _getwch(); //Will return '0'
ch = _getwch(); //Will return valid scan code
}
为了回答您的问题,键盘扫描代码规范中提供了有效扫描代码列表。
例如,上述函数的第二次调用将返回 68 (0x44) 以按下 F10 键,在 MSDN 中也是如此:
Key Scan Codes中存在相同的列表,但由于文档较旧,无法进行身份验证。
推荐阅读
- python-2.7 - 如何打印列表中的列表
- javascript - 让VS代码在调试js代码时默认选择Node.js环境
- c++ - 在 intel 内部函数 (AVX) 中使用混合指令
- sql - 将 varchar 转换为日期 ddmmyyyy 时出错
- azure - Azure VM 无法访问端口 8080
- ios - Kingfisher + RxSwift DownsamplingImageProcessor 图像失败
- python-3.x - 从python中的元素列表中获取属性
- kubernetes - 使用 sh 命令时 Kubernetes Pod 的容器未运行
- flutter - 如何创建自定义颤振 sdk 小部件,重建颤振和使用新的小部件
- python - 在不同列上解析 JSON 的结果