QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1133|回复: 5

unix环境下怎样判断用户输入组合键?

[复制链接]
发表于 2005-3-3 15:06:28 | 显示全部楼层 |阅读模式
想根据用户输入不同的指令键得到不同的响应,如ctrl+alt,ctrl+enter等
还有f1,f2.......f12等,请大家不吝赐教
发表于 2005-3-3 22:46:53 | 显示全部楼层
设置为非规范方式
struct termios* a = (struct termios*)malloc(sizeof(struct termios));
ioctl(0,TCGETS,a);
a->c_lflag &= ~ICANON;
ioctl(0,TCSETS,a);
free(a);
然后自己测各键就可以了。我以前就是用这种方法读方向键的。
回复

使用道具 举报

 楼主| 发表于 2005-3-4 12:03:09 | 显示全部楼层
不好意思,看不明白啊!   struct termios 需要include哪个头文件?
还有TCGETS和TCSETS是什么参数啊?ioctl函数里没查到这两个控制功能的参数啊!
请说详细点好吗
回复

使用道具 举报

发表于 2005-3-4 13:13:03 | 显示全部楼层
我刚好在整理这个东西,贡献出来吧,没怎么测试过
[code:1]
/* kbhit.h*/
#ifndef _MY_KBHIT_H_
#define _MY_KBHIT_H_

#define KEY_TAB                 0x0009
#define KEY_ESC                 0x001B
#define KEY_F1                  0xff01
#define KEY_F2                  0xff02
#define KEY_F3                  0xff03
#define KEY_F4                  0xff04
#define KEY_F5                  0xff05
#define KEY_F6                  0xff06
#define KEY_F7                  0xff07
#define KEY_F8                  0xff08
#define KEY_F9                  0xff09
#define KEY_F10                 0xff0a
#define KEY_F11                 0xff0b
#define KEY_F12                 0xff0c
#define KEY_INS                 0xff0d
#define KEY_DEL                 0xff0e
#define KEY_END                 0xff0f
#define KEY_UP                  0xff10
#define KEY_DOWN                0xff11
#define KEY_LEFT                0xff12
#define KEY_RIGHT               0xff13
#define KEY_HOME                0xff14
#define KEY_PgDn                0xff15
#define KEY_PgUp                0xff16

int set_tty();
int kbhit();
void restore();

#endif

[/code:1]

[code:1]
/* kbhit.c */
#include <stdio.h>
#include <termio.h>
#include "kbhit.h"
char keysym_def[][6]={
    // first 5 bytes are key codes
    {0x1b,0x5b,0x5b,0x41,0x00,(char) (0xff&KEY_F1)},
    {0x1b,0x5b,0x5b,0x42,0x00,(char) (0xff&KEY_F2)},
    {0x1b,0x5b,0x5b,0x43,0x00,(char) (0xff&KEY_F3)},
    {0x1b,0x5b,0x5b,0x44,0x00,(char) (0xff&KEY_F4)},
    {0x1b,0x5b,0x5b,0x45,0x00,(char) (0xff&KEY_F5)},
    {0x1b,0x5b,0x31,0x37,0x7e,(char) (0xff&KEY_F6)},
    {0x1b,0x5b,0x31,0x38,0x7e,(char) (0xff&KEY_F7)},
    {0x1b,0x5b,0x31,0x39,0x7e,(char) (0xff&KEY_F8)},
    {0x1b,0x5b,0x32,0x30,0x7e,(char) (0xff&KEY_F9)},
    {0x1b,0x5b,0x32,0x31,0x7e,(char) (0xff&KEY_F10)},
    {0x1b,0x5b,0x32,0x33,0x7e,(char) (0xff&KEY_F11)},
    {0x1b,0x5b,0x32,0x34,0x7e,(char) (0xff&KEY_F12)},
    {0x1b,0x5b,0x32,0x7e,0x00,(char) (0xff&KEY_INS)},
    {0x1b,0x5b,0x33,0x7e,0x00,(char) (0xff&KEY_DEL)},
    {0x1b,0x5b,0x34,0x7e,0x00,(char) (0xff&KEY_END)},
    {0x1b,0x5b,0x41,0x00,0x00,(char) (0xff&KEY_UP)},
    {0x1b,0x5b,0x42,0x00,0x00,(char) (0xff&KEY_DOWN)},
    {0x1b,0x5b,0x44,0x00,0x00,(char) (0xff&KEY_LEFT)},
    {0x1b,0x5b,0x43,0x00,0x00,(char) (0xff&KEY_RIGHT)},
    {0x1b,0x5b,0x31,0x7e,0x00,(char) (0xff&KEY_HOME)},
    {0x1b,0x5b,0x36,0x7e,0x00,(char) (0xff&KEY_PgDn)},
    {0x1b,0x5b,0x35,0x7e,0x00,(char) (0xff&KEY_PgUp)},
    {0x00,0x00,0x00,0x00,0x00,0x00}
};

struct termio ttysave;
int set_tty()
{
    struct termio tty;
    if(ioctl(0, TCGETA, &tty)==-1){
        printf("error while setup tty\n");
        return -1;
    }
    ttysave = tty;
    tty.c_lflag &= ~(ICANON | ECHO| ISIG);
    tty.c_cc[VMIN] = 1;
    tty.c_cc[VTIME] = 0;
    if(ioctl(0, TCSETAF, &tty)==-1){
        restore();
        printf("error while setup tty\n");
        return -1;
    }
    return 0;
}
int kbhit()
{
    char ch[10]={0,0,0,0,0,0,0,0,0,0};
    read(0, ch, 10);
    if(ch[0]>=0x20 && ch[0]<=0x7e || ch[0]==0x0a || ch[0] == 0x09)
        return ch[0];
    else if(ch[0] == 0x1b && ch[1] == 0x00)
        return KEY_ESC;
    else if(ch[0] == 0x1b && ch[1] == 0x5b)
    {
        int i=0;
        while(keysym_def[i][0] != 0x00)
        {
            if(keysym_def[i][2] == ch[2]
                    && keysym_def[i][3] == ch[3]
                    && keysym_def[i][4] == ch[4])
            {
                return (0xff00+keysym_def[i][5]);
            }
            i++;
            i++;
        }
    }
    else
        return 0x11;
}

void restore()
{
    if(ioctl(0, TCSETAF, &ttysave)==-1){
        printf("restore error\n");
    }
    return;
}
int main(int argc, char* argv[])
{
    char ch;
    char str[1024];

        set_tty();
    do{
        ch=kbhit();
        printf("You Press 0x%02x\n",ch);
    }while(ch!=0x11);   //Ctrl+C is 0x11
        restore();

    exit(0);
}

[/code:1]
回复

使用道具 举报

发表于 2005-3-4 14:09:11 | 显示全部楼层
好东西
回复

使用道具 举报

 楼主| 发表于 2005-3-4 14:33:14 | 显示全部楼层
能给讲解一下ioctl的用法吗
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-6 13:47 , Processed in 0.058491 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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