怎样在C语言程序中使用功能键和箭头键?
在程序中使用功能键和箭头键可以使程序更容易使用。箭头键可用来移动光标,而功能键使用户能做一些特殊的事情,还可用来替代一些经常要键入的字符序列。
然而,与其它“特殊”功能一样,C语言本身并没有提供读入功能键和箭头键的标准方法。用scanf()来接受这些特殊字符是不可取的,同样,用getchar()也不行。为此,你需要编写一个小函数,让它向DOS询问被按下的键的值。请看下例:
#include<dos.h>
int GetKey()
{
union REGS in,out;
in.h.ah=0x8;
int86(0x21,&in,&out);
return out.h.al;
}
这种方法跳过C的输入/输出库,直接从键缓冲区中读取下一个键。这样做的好处是不会漏掉特殊的键码,并且所按的键能立即得到响应,而不用先存到缓冲区中,等到按下Enter键时才得到响应。
通过这个函数你可以得到所按的键的整数值键码。请看下面这个测试程序:
# include <stdio. h>
# include <dos. h>
int GetKey()
union REGS in, out ~
in. h. ah = 0xS~
int86( 0x21, &in, &out );
return out. h. al;
int main()
{
int c ;
while ( c=GetKey() ) !=27 )
/ * Loop until escape is pressed */
{
printf ("Key = %d.\n" , c );
}
return 0 ;
}
如果你键入一个字符串,那么上述程序可能会输出这样的结果:
key = 66.
key=111.
key=98.
key=32.
key=68.
key=111.
key=98.
key=98.
key=115.
当你按下功能键或箭头键时,将发生不同的情况:你所看到的将是一个0,其后跟着一个字符值。这就是特殊键的表示方法:在一个0值后面跟着一个特殊的值。
因此,你可以用两种方法来处理特殊键。首先,你可以检测GetKey()的返回值,一旦检测到一个0,你就按特殊的方式去处理GetKey()读入的下一个字符。其次,你可以在GetKey()中检测读入的字符值,一旦检测到一个0,就接着读入下一个字符值,然后按某种方式修改这个值,并返回修改后的值。第二种方法比第一种方法更好。下面是一个改进了的GetKey()函数:
/*
New improved key-getting function.
*/
int GetKey()
union REGS in, out;
in. h. ah = 0x8;
int86( 0x21, &in, &out );
if (out. h. al == 0 )
return GetKey ( ) + 128 ;
else
return out. h. al ;
这种方法中更清晰也最有效,它使程序无需检查是否读入了特殊键,因此减轻了程序员的工作量。在这种方法中,特殊键的值总是大于128。
然而,与其它“特殊”功能一样,C语言本身并没有提供读入功能键和箭头键的标准方法。用scanf()来接受这些特殊字符是不可取的,同样,用getchar()也不行。为此,你需要编写一个小函数,让它向DOS询问被按下的键的值。请看下例:
#include<dos.h>
int GetKey()
{
union REGS in,out;
in.h.ah=0x8;
int86(0x21,&in,&out);
return out.h.al;
}
这种方法跳过C的输入/输出库,直接从键缓冲区中读取下一个键。这样做的好处是不会漏掉特殊的键码,并且所按的键能立即得到响应,而不用先存到缓冲区中,等到按下Enter键时才得到响应。
通过这个函数你可以得到所按的键的整数值键码。请看下面这个测试程序:
# include <stdio. h>
# include <dos. h>
int GetKey()
union REGS in, out ~
in. h. ah = 0xS~
int86( 0x21, &in, &out );
return out. h. al;
int main()
{
int c ;
while ( c=GetKey() ) !=27 )
/ * Loop until escape is pressed */
{
printf ("Key = %d.\n" , c );
}
return 0 ;
}
如果你键入一个字符串,那么上述程序可能会输出这样的结果:
key = 66.
key=111.
key=98.
key=32.
key=68.
key=111.
key=98.
key=98.
key=115.
当你按下功能键或箭头键时,将发生不同的情况:你所看到的将是一个0,其后跟着一个字符值。这就是特殊键的表示方法:在一个0值后面跟着一个特殊的值。
因此,你可以用两种方法来处理特殊键。首先,你可以检测GetKey()的返回值,一旦检测到一个0,你就按特殊的方式去处理GetKey()读入的下一个字符。其次,你可以在GetKey()中检测读入的字符值,一旦检测到一个0,就接着读入下一个字符值,然后按某种方式修改这个值,并返回修改后的值。第二种方法比第一种方法更好。下面是一个改进了的GetKey()函数:
/*
New improved key-getting function.
*/
int GetKey()
union REGS in, out;
in. h. ah = 0x8;
int86( 0x21, &in, &out );
if (out. h. al == 0 )
return GetKey ( ) + 128 ;
else
return out. h. al ;
这种方法中更清晰也最有效,它使程序无需检查是否读入了特殊键,因此减轻了程序员的工作量。在这种方法中,特殊键的值总是大于128。