【问题标题】:What does getch() really get? Scan codes?getch() 真正得到了什么?扫码?
【发布时间】:2014-01-29 10:33:48
【问题描述】:
#include <conio.h>

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

我要获取扫描码。

这是来自Wikipedia的描述:

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

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

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

虽然有些与表格相同,但其显示的大部分值与表格不同。

那么,getch() 真的有扫码吗?

这里是扫码表(设置2,最常用)

【问题讨论】:

  • 通常情况下,我不反对在适当的情况下使用goto。但这里不合适;无限循环将是更好的选择。
  • @glglgl 已编辑。谢谢你的建议。 :-)
  • 这真的是您使用的代码吗?它应该打印一个 3 位数的零填充十进制数,后跟十六进制。我很好奇某处没有错误,因为 0x86 似乎只是无法生产。 num pad pg up 会发生什么?
  • @user3125280 抱歉。我编辑了代码。
  • @KevinDongNaiJia 这给了你这些确切的结果?我能看到 0x86 产生的唯一方法是从第 1 组,当 5 键是释放 (0x80 + 0x06) 并且这不会在 e0 之前。

标签: c console-application mingw32 getch conio


【解决方案1】:

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

然后我在这里找到了一个与之匹配的表(最右边的列)。对我来说,“白色”键使用 shift 和数字键盘等效项,“灰色”键是独立的向上翻页、向下翻页等。我发现在数字键盘上输入的一个差异是和普通的回车键一样。

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

我不知道这个表是从哪里来的,除非你点击“About The Guide”,它显示的是“The Microsoft C Database, Copyright (C) 1987, by Peter Norton”。彼得从哪里弄来的,我不知道。

【讨论】:

  • Andries Brouwer 在他的网站上详细讨论了不同的键盘扫描码:win.tue.nl/~aeb/linux/kbd/scancodes-1.html
  • 如果我错了,请原谅我,但该表似乎与我找到的其他标准表相似,并且在所有这些表中都没有 0x86
  • 粗鲁,你是对的。我一直在寻找 86,但 Google 的点击量不断出现其他东西(x86),所以我专注于向下翻页代码而不是向上翻页代码,最后都忘了检查。
  • 好吧,从表格的外观来看,灰色和白色 ctrl pageup 是相等的——也许笔记本电脑只是使用不同的扫描码来区分(即使它只有一个 pageup)。也许如果 OP 发布更多扫描代码..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2020-05-24
相关资源
最近更新 更多