c 终端控制

#include <stdio.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>

char my_getch()
{
        int c=0;
        struct termios org_opts, new_opts;
        int res=0;

        res=tcgetattr(STDIN_FILENO, &org_opts);
        assert(res==0);

        memcpy(&new_opts, &org_opts, sizeof(new_opts));
        new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE | ICRNL);
        tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);

        c=getchar();
        res=tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);
        assert(res==0);
        return c;
}

键盘输入不回显处理

/×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <curses.h>
#include <term.h>
#include <unistd.h>

static int peek_character = -1; 

int kbhit()
{
    char ch;int x;
    int nread;
    struct termios old_settings,new_settings;

    tcgetattr(STDIN_FILENO,&old_settings);
    new_settings=old_settings;
    new_settings.c_lflag &=~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOKE|ICRNL)  ;
    new_settings.c_cc [VMIN]=1  ;
    new_settings.c_cc [VTIME]=0  ;
    tcsetattr(STDIN_FILENO,TCSANOW,&new_settings);

    if(peek_character!=-1)
        x= 1;
    new_settings.c_cc [VMIN]=0  ;
    tcsetattr(STDIN_FILENO,TCSANOW,&new_settings);

    nread=read(0,&ch,1);
    new_settings.c_cc [VMIN]=1  ;
    tcsetattr(STDIN_FILENO,TCSANOW,&new_settings);

    if(nread==1) {
        peek_character=ch;
        x=1;
    }   
    else x=0;
    tcsetattr(STDIN_FILENO,TCSANOW,&old_settings);
    return x;
}
int readch()
{
    char ch; 

    if(peek_character!=1) {
        ch=peek_character;
        peek_character=-1;
        return ch; 
    }   
    read(0,&ch,1);
    return ch; 
}

检测有键盘输入并返回键值

 

posted @ 2015-02-12 12:44  chencesc  阅读(388)  评论(0编辑  收藏  举报