当前位置: 技术问答>linux和unix
关于Unix上读取键盘输入的问题(curses)
来源: 互联网 发布时间:2014-12-31
本文导语: 大家用过curses编程,对于PageUp和ESC的读取,我似乎无法解决,如果确实想按ESC, 似乎 if ( in_char == -1 ) 不能立刻得到, 而在按了下一个键后,就返回了ESC. 请有过这方面经验的帮忙。 in_char = getch(); if ( ...
大家用过curses编程,对于PageUp和ESC的读取,我似乎无法解决,如果确实想按ESC,
似乎 if ( in_char == -1 ) 不能立刻得到, 而在按了下一个键后,就返回了ESC.
请有过这方面经验的帮忙。
in_char = getch();
if ( in_char == CTL_V ) return KEY_PGDN;
else
if ( in_char != ESC ) return in_char;
in_char = getch();
if ( in_char == -1 ) return ESC;
else
if ( in_char == 'v' ) return KEY_PGUP;
else
if ( in_char == '[' )
{
in_char = getch();
switch ( in_char )
{
case 'A': return KEY_UP;
case 'B': return KEY_DOWN;
case 'C': return KEY_RIGHT;
case 'D': return KEY_LEFT;
case 'H': return KEY_A1;
case 'J': return KEY_A3;
case 'K': return KEY_C3;
似乎 if ( in_char == -1 ) 不能立刻得到, 而在按了下一个键后,就返回了ESC.
请有过这方面经验的帮忙。
in_char = getch();
if ( in_char == CTL_V ) return KEY_PGDN;
else
if ( in_char != ESC ) return in_char;
in_char = getch();
if ( in_char == -1 ) return ESC;
else
if ( in_char == 'v' ) return KEY_PGUP;
else
if ( in_char == '[' )
{
in_char = getch();
switch ( in_char )
{
case 'A': return KEY_UP;
case 'B': return KEY_DOWN;
case 'C': return KEY_RIGHT;
case 'D': return KEY_LEFT;
case 'H': return KEY_A1;
case 'J': return KEY_A3;
case 'K': return KEY_C3;
|
我没用用过curses,我用的是ioctl,设置终端类型为0个缓冲,每次读键盘0.2秒没有东西返回一个特定值,代码和你的差不多
#include
#include
static struct termio ttysave ;
void restore() ;
char getch() ;
main()
{
puts( "---------------------------" ) ;
puts( "enter a key : " );
getch() ;
puts( "n--------------" );
exit( 0 );
}
char getch()
{
static char ch ;
static int total, flag = 1 ;
struct termio tty ;
if( flag )
{
flag = 0 ;
if( ioctl( 0, TCGETA, &tty ) == -1 )
{
perror( "ioctl" );
exit( -1 );
}
ttysave = tty ;
tty.c_lflag &= ~( ICANON | ECHO | ISIG ) ;
tty.c_cc[VMIN] = 1 ; // MIN
tty.c_cc{VTIME] = 0 ; // TIME
if( ioctl( 0, TCSETAF, &tty ) == -1 )
{
restore();
perror( "ioctl" );
exit( -2 );
}
}
switch( total = read( 0, &ch, 1 ))
{
case -1 :
restore() ;
perror( "read" );
exit( 3 );
case 0:
restore():
fputs( "EOF error!", stderr );
exit( 4 ) ;
default:
.....
}
restore();
return( ch );
}
void restore()
{
if( ioctl( 0, TCSETAF, &ttysave ) == -1 )
{
perror( "ioctl" );
exit( 5 );
}
return ;
}
这是初始化部分
#include
#include
static struct termio ttysave ;
void restore() ;
char getch() ;
main()
{
puts( "---------------------------" ) ;
puts( "enter a key : " );
getch() ;
puts( "n--------------" );
exit( 0 );
}
char getch()
{
static char ch ;
static int total, flag = 1 ;
struct termio tty ;
if( flag )
{
flag = 0 ;
if( ioctl( 0, TCGETA, &tty ) == -1 )
{
perror( "ioctl" );
exit( -1 );
}
ttysave = tty ;
tty.c_lflag &= ~( ICANON | ECHO | ISIG ) ;
tty.c_cc[VMIN] = 1 ; // MIN
tty.c_cc{VTIME] = 0 ; // TIME
if( ioctl( 0, TCSETAF, &tty ) == -1 )
{
restore();
perror( "ioctl" );
exit( -2 );
}
}
switch( total = read( 0, &ch, 1 ))
{
case -1 :
restore() ;
perror( "read" );
exit( 3 );
case 0:
restore():
fputs( "EOF error!", stderr );
exit( 4 ) ;
default:
.....
}
restore();
return( ch );
}
void restore()
{
if( ioctl( 0, TCSETAF, &ttysave ) == -1 )
{
perror( "ioctl" );
exit( 5 );
}
return ;
}
这是初始化部分
|
这个问题估计是你参数设置的不对,试一试
在你的getch调用前使用这两个函数
nonl();
raw();
应该就可以解决你那个问题
在你的getch调用前使用这两个函数
nonl();
raw();
应该就可以解决你那个问题