首页 > 解决方案 > `getwch` 返回的键码是什么?

问题描述

msvcrt.getwch用来在面向 Windows 的 Python 中进行交互式提示。

文档说:

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

我发现 F10 使用前者\x00D,而 F11 使用后者\xe0\x85

但是,这并没有说明键码是什么。这很重要,因为我没有\xe0键 (à) 以及其他键,因此无法测试输入此值的输出。


额外的上下文

例如,我尝试通过两种方式将此键粘贴到提示符中。


鉴于这msvcrt似乎是 Visual C++ 的包装,我也查看了该文档。

_getch 和 _getwch 函数从控制台读取单个字符而不回显该字符。这些函数都不能用于读取 CTRL+C。读取功能键或方向键时,每个功能必须调用两次;第一次调用返回 0 或 0xE0,第二次调用返回实际的键码。

这也没有说明键码是什么。

我在网上查过,但我只能找到有关虚拟键码的信息,但是这说 F10 是\x79,F11 是\x7A。由于这个函数没有返回这些值,我知道它不是指这些键码。

标签: pythonwindowsvisual-c++keycode

解决方案


将仅在 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 中也是如此: F10扫码

Key Scan Codes中存在相同的列表,但由于文档较旧,无法进行身份验证。


推荐阅读