QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 818|回复: 2

GCC 程序中如何取得按键信息?

[复制链接]
发表于 2004-8-28 12:28:31 | 显示全部楼层 |阅读模式
程序如何知道,按了哪个键?
比如方向键。
发表于 2004-8-28 14:21:13 | 显示全部楼层
我想可以用getchar()来捕捉对应的ACSII码吧
回复

使用道具 举报

发表于 2004-8-28 15:39:25 | 显示全部楼层
是C程序(不叫GCC程序)。处理键盘消息要根据你所写的应用以及要采用的库来决定,比如SDL和gtk等都提供了现成的函数,如果你只是想用C和一些基本库来处理键盘输入,一般都会用到ioctl,如下所示函数可以读取键盘输入,但无输入亦会返回。
[code:1]
#include <termios.h>
#include <sys/ioctl.h>

int getkey(void)
{
    struct termio zap, original;
    int e;
    char c;

    ioctl(fileno(stdin), TCGETA, &original);    /* Get termio */
    zap = original;
    zap.c_cc[VMIN] = 0;                         /* Modify termio  */
    zap.c_cc[VTIME] = 0;
    zap.c_lflag = 0;
    ioctl(fileno(stdin), TCSETA, &zap);         /* Set new termio */
    e = read(fileno(stdin), &c, 1);             /* Read one char */
    ioctl(fileno(stdin), TCSETA, &original);    /* Restore termio */
    if (e != 1)
        return 0;                               /* No key pressed. */
    return c;                                   /* Return key. */
}
[/code:1]

如何应用可再看以下例子(它会等待键被按下):
[code:1]
#define K_ESC     -1
#define K_UP      -8
#define K_DOWN    -9
#define K_LEFT    -10
#define K_RIGHT   -11
#define K_ENTER   -12
#define K_SPACE   -13
#define K_F1      -21
#define K_F2      -22
#define K_F3      -23
#define K_F4      -24
#define K_F5      -25
#define K_UNUSE   -111

int my_getkey(void)
{
  int key;
  for(;;){
    key=vga_getkey();
    if(key!=0)break;         /* If no key pressed then continue. */
  }
  if(key != 0x1b) {  /* not ESC */
    switch (key) {
      case 10:
        return K_ENTER;      /* ENTER */
      case 32:
        return K_SPACE;      /* Space */
      default:
        return key;         
    }
  }
  if((key = vga_getkey()) != '[') {
    return K_ESC;            /* it was ESC */
  }
  switch (key = vga_getkey()) {
    case 'A':
      return K_UP;           /* up */
    case 'B':
      return K_DOWN;         /* down */
    case 'C':
      return K_RIGHT;        /* right */
    case 'D':
      return K_LEFT;         /* left */
    case '[':
      switch (key = vga_getkey()) {
        case 'A':
          return K_F1;
        case 'B':
          return K_F2;
        case 'C':
          return K_F3;
        case 'D':
          return K_F4;
        case 'E':
          return K_F5;
        default:
          return -111;
      }
    default:
      return -111;         /* ignore */
  }
}
[/code:1]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 15:29 , Processed in 0.052503 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表