残培和箭码残培和箭码(getch and arrow codes)

2019-05-13 20:43发布

我正在写一个使用一个PROGRAMM getch()扫描箭头键。 到目前为止我的代码是:

switch(getch()) {
    case 65:    // key up
        break;
    case 66:    // key down
        break;
    case 67:    // key right
        break;
    case 68:    // key left
        break;
}

问题是,当我按'A''B''C''D'的代码也将执行,因为65是十进制代码'A' ,等...

有没有一种方法来检查,而不调用别人的箭头键?

谢谢!

Answer 1:

通过按下一个箭头键, getch将推三个值到缓冲区:

  • '\033'
  • '['
  • 'A' 'B' 'C''D'

因此,代码将是这样的:

if (getch() == '\033') { // if the first value is esc
    getch(); // skip the [
    switch(getch()) { // the real value
        case 'A':
            // code for arrow up
            break;
        case 'B':
            // code for arrow down
            break;
        case 'C':
            // code for arrow right
            break;
        case 'D':
            // code for arrow left
            break;
    }
}


Answer 2:

残培()函数返回箭头键2个键码(和其他一些特殊的键),在由FatalError注释中。 它返回0(0×00)或224(取0xE0),然后再返回一个代码,用于识别被按下的键。

对于箭头键,则它返回224第一然后是72(最多),80(下),75(左)和77(右)。 如果NUM-垫箭头键(数字锁定与关闭)被按压,则getch()返回0第一代替224。

请注意,残培()以任何方式不规范,而这些代码可能因编译器而异。 这些代码由MinGW的和Visual C ++在Windows上返回。

一个方便的程序,看的getch()的行动的各种按键是:

#include <stdio.h>
#include <conio.h>

int main ()
{
    int ch;

    while ((ch = _getch()) != 27) /* 27 = Esc key */
    {
        printf("%d", ch);
        if (ch == 0 || ch == 224)
            printf (", %d", _getch ()); 
        printf("\n");
    }

    printf("ESC %d\n", ch);

    return (0);
}

这适用于MinGW的和Visual C ++。 这些编译器使用的名称_getch(),而不是残培(),以表明它是一个非标准的功能。

所以,你可以这样做:

ch = _getch ();
if (ch == 0 || ch == 224)
{
    switch (_getch ())
    {
        case 72:
            /* Code for up arrow handling */
            break;

        case 80:
            /* Code for down arrow handling */
            break;

        /* ... etc ... */
    }
}


Answer 3:

所以,奋斗了很多之后,我奇迹般地解决了这个问题everannoying! 我试图模仿Linux终端和被困在那里它让您可通过按下向上或向下箭头键来访问命令历史记录的一部分。 我发现ncurses的LIB是painfuly很难理解,慢慢地学习。

char ch = 0, k = 0;
while(1)
{
  ch = getch();
  if(ch == 27)                  // if ch is the escape sequence with num code 27, k turns 1 to signal the next
    k = 1;
  if(ch == 91 && k == 1)       // if the previous char was 27, and the current 91, k turns 2 for further use
    k = 2;
  if(ch == 65 && k == 2)       // finally, if the last char of the sequence matches, you've got a key !
    printf("You pressed the up arrow key !!\n");
  if(ch == 66 && k == 2)                             
    printf("You pressed the down arrow key !!\n");
  if(ch != 27 && ch != 91)      // if ch isn't either of the two, the key pressed isn't up/down so reset k
    k = 0;
  printf("%c - %d", ch, ch);    // prints out the char and it's int code

这是一种大胆的,但它解释了很多。 祝好运 !



Answer 4:

其实,阅读方向键一个需要读它的扫描码。 以下是通过方向键按(不释键)所产生的扫描码

当NUM LOCK处于关闭状态

  • 左E0 4B
  • 右E0 4D
  • 截至48 E0
  • 唐氏E0 50

当Num Lock键锁定这些键之前得到用E0 2A

  • 字节E0为-32
  • 字节48是72 UP
  • 字节50是80 DOWN

     user_var=getch(); if(user_var == -32) { user_var=getch(); switch(user_var) { case 72: cur_sel--; if (cur_sel==0) cur_sel=4; break; case 80: cur_sel++; if(cur_sel==5) cur_sel=1; break; } } 

在上面的代码中,我假设程序员想搬到只有4行。



Answer 5:

keypad将允许用户终端的键盘,以允许功能键被解释为一个单一的值(即没有转义序列)。

正如在手册页指出:

键盘选项使用户终端的键盘。 如果启用(bf为TRUE),则用户可以按下一个功能键(例如箭头键),并wgetch返回表示功能键的单个值,如在KEY_LEFT。 如果禁用(bf为FALSE),诅咒不会把功能键特别程序已经解释转义序列本身。 如果在终端键盘上可以(由传输)及关闭(由于本地工作),启用此选项将导致导通时wgetch被称为在终端键盘。 对于键盘的默认值是假的。



Answer 6:

对于使用溶液ncurses有工作码,并ncurses的初始化见的getchar(),用于向上和向下箭头键返回相同的值(27)



Answer 7:

我一直在使用的getch得到箭头编写的代码的功能。 这是一个quick'n'dirty解决方案,但根据箭头键的功能将返回一个ASCII码:UP:-10 DOWN:-11 RIGHT:-12 LEFT:-13

此外,使用此功能,您将能够者区分的ESCAPE触摸键和方向键。 但是,你必须按下ESC 2时激活ESC键。

这里的代码:

char getch_hotkey_upgrade(void)
{
  char ch = 0,ch_test[3] = {0,0,0};

    ch_test[0]=getch();

    if(ch_test[0] == 27)
    {
        ch_test[1]=getch();

        if (ch_test[1]== 91)
        {
            ch_test[2]=getch();

            switch(ch_test[2])
            {
            case 'A':
                //printf("You pressed the up arrow key !!\n");
                //ch = -10;
                ch = -10;
                break;
            case 'B':
                //printf("You pressed the down arrow key !!\n");
                ch = -11;
                break;
            case 'C':
                //printf("You pressed the right arrow key !!\n");
                ch = -12;
                break;
            case 'D':
                //printf("You pressed the left arrow key !!\n");
                ch = -13;
                break;
            }
        }
        else
         ch = ch_test [1];
    }
    else
        ch = ch_test [0];
  return ch;
}


Answer 8:

我只是一个首发,但我心中已经创建了一个char(for example "b")和我做b = _getch(); (它的一个conio.h库的命令),查看

If (b == -32)
b = _getch();

而做检查的钥匙(72后,80下,77对,75左)



Answer 9:

    void input_from_key_board(int &ri, int &ci)
{
    char ch = 'x';
    if (_kbhit())
    {
        ch = _getch();
        if (ch == -32)
        {
            ch = _getch();
            switch (ch)
            {
            case 72: { ri--; break; }
            case 80: { ri++; break; }
            case 77: { ci++; break; }
            case 75: { ci--; break; }

            }
        }
        else if (ch == '\r'){ gotoRowCol(ri++, ci -= ci); }
        else if (ch == '\t'){ gotoRowCol(ri, ci += 5); }
        else if (ch == 27) { system("ipconfig"); }
        else if (ch == 8){ cout << " "; gotoRowCol(ri, --ci); if (ci <= 0)gotoRowCol(ri--, ci); }
        else { cout << ch; gotoRowCol(ri, ci++); }
        gotoRowCol(ri, ci);
    }
}


Answer 10:

怎么样想的?

void CheckKey(void) {
int key;
if (kbhit()) {
    key=getch();
    if (key == 224) {
        do {
            key=getch();
        } while(key==224);
        switch (key) {
            case 72:
                printf("up");
                break;
            case 75:
                printf("left");
                break;
            case 77:
                printf("right");
                break;
            case 80:
                printf("down");
                break;
        }
    }
    printf("%d\n",key);
}

int main() {
    while (1) {
        if (kbhit()) {
            CheckKey();
        }
    }
}

(如果你不明白为什么还有224,然后尝试运行此代码:)

#include <stdio.h>
#include <conio.h>

int main() {
    while (1) {
        if (kbhit()) {
            printf("%d\n",getch());
        }
    }
}

但我不知道为什么它是224,你可以写下评论,如果你知道为什么吗?



文章来源: getch and arrow codes