getch()函数到底获取什么?扫描码吗?

7
#include <conio.h>

int main (void)
{
    for (;;)
    {
        unsigned char ch = getch();
        printf ("0x%02X\n", ch);
    }
}

我想获取扫描码。

以下是来自 维基百科 的描述:

    Reads a character directly from the console without buffer, and without echo.

当我按下 Del 键时,它会显示 0xE0 0x53。

当我按下 Ctrl+PgUp 键时,它会显示 0xE0 0x86。

虽然有些值与表格相同,但大多数值与表格不同。

那么,getch() 确实能获取扫描码吗?

以下是扫描码表(第2集,最常用)

Scan Code


这真的是你正在使用的代码吗?它应该打印一个前导零的三位十进制数,后跟十六进制数。我很好奇是否存在某个错误,因为0x86似乎只是无法复现的。如果按下数字键盘上的PgUp键会发生什么? - user3125280
@user3125280 抱歉,我已经编辑了代码。 - Kevin Dong
1
@KevinDongNaiJia,这样就能得到确切的结果了吗?我唯一能看到0x86产生的方式是从set 1中,当5键释放时(0x80 + 0x06),而且这不会以e0为前缀。 - user3125280
@user3125280 抱歉,我正在使用笔记本电脑。 :-( - Kevin Dong
你使用的编译器是什么?MSDN关于_getch的网页表明它返回的是ANSI或UNICODE,而不是扫描码。看一下寻找'y'或'Y'的示例。 - rcgldr
显示剩余2条评论
1个回答

0

我在VS 2012(C++)中运行了一个控制台应用程序,得到了与您相同的结果。它确实说getch()已被弃用,应该使用_getch(),但这没有任何区别。

然后我在这里找到了一个匹配表(最右列)。对我来说,“白色”键使用Shift和数字键盘等效键,“灰色”键是独立的PageUp、PageDown等。我发现的唯一不符之处是数字键盘上的Enter与常规Enter键相同。

http://www.itlnet.net/programming/program/Reference/msc/ng7d68f.html

我不知道这个表格来自哪里,除非你点击“关于指南”,它会显示“Microsoft C数据库,版权所有(C)1987年,Peter Norton”。至于Peter从哪里得到它,我不知道。


1
Andries Brouwer在他的网站上详细讨论了不同的键盘扫描码:http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html - Nerf Herder
请原谅我如果我错了,但是那个表格看起来与我找到的其他标准表格相似,在所有这些表格中都没有0x86。 - user3125280
crud,你说得对。我一直在寻找86,但谷歌搜索结果总是出现其他东西(x86),所以我开始关注向下翻页代码而忘记同时检查向上翻页代码,在最后没有检查到。 - Nerf Herder
从表格的外观来看,灰色和白色的Ctrl PageUp是相等的 - 也许笔记本电脑只是使用了不同的扫描码来区分它们(即使它只有一个PageUp键)。也许如果OP发布更多的扫描码就好了。 - user3125280

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接