如何使用键盘功能与_getch(),因为它可以使用getline()?

时间:2016-11-02 19:11:59

标签: c++ getline getch

我的问题是,当我的用户在终端推送制表时,我想做一件特别的事情。我的第一个代码解释了:

char buffer[100];

while (true)
{
    std::cin.getline(buffer, 100); // do IMMEDIATELY something if 'tabulation' was used ?

}

所以我问自己如何检查每个字符?我试过 _getch();

while (true)
{
    c = _getch();

    if (c == '\t')
        // do something special
    else
        std::cout << (char)c;
}

但是现在,我不能使用任何特殊功能键作为箭头,del,suppr等...我不能 移动 到我输入的内容中尽可能地使用getline()

那么有什么解决方案可以在getline()的中间进行特殊中断吗? 或者是否可以以不同的方式使用_getch()? 我还尝试做另一个线程(一个用getline(),另一个用_getch()来检查每个线程但是我不太确定我能用线程做什么。

可以手动处理每个特殊功能(箭头键,del,suppr等),但我正在寻找另一种解决方案。

1 个答案:

答案 0 :(得分:1)

假设您的意思是Microsoft C运行时库中的_getch()函数:

  

_getch _getwch 函数从中读取单个字符   控制台没有回应角色。这些功能都不是   用于读取CTRL + C.每次读取功能键或箭头键时   函数必须被调用两次;第一个调用返回0或0xE0,和   第二个调用返回实际的密钥代码。

因此,如果_getch()返回0或0xE0(224),则您必须再次调用函数以查看按下了哪个特定键。

至少在我的机器上,这些“扩展”字符代码如下(十进制):

  • 0 59 = F1
  • 0 60 = F2
  • 0 61 = F3
  • 0 62 = F4
  • 0 63 = F5
  • 0 64 = F6
  • 0 65 = F7
  • 0 66 = F8
  • 0 67 = F9
  • 0 68 = F10
  • 224 71 =主页
  • 224 72 =↑(向上箭头)
  • 224 73 = Page Up
  • 224 75 =←(左箭头)
  • 224 77 =→(右箭头)
  • 224 79 =结束
  • 224 80 =↓(向下箭头)
  • 224 81 = Page Down
  • 224 82 =插入
  • 224 83 =删除
  • 224 133 = F11
  • 224 134 = F12

关于使用这些代码的内容,请查看SetConsoleCursorPosition及相关的控制台API函数。