VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1548|回复: 12

[原创] 怎样在C语言程序中使用功能键和箭头键?

[复制链接]
79_avatar_middle
在线会员 发表于 2016-2-21 14:26:10 | 显示全部楼层 |阅读模式
在程序中使用功能键和箭头键可以使程序更容易使用。箭头键可用来移动光标,而功能键使用户能做一些特殊的事情,还可用来替代一些经常要键入的字符序列。

然而,与其它“特殊”功能一样,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。

评分

参与人数 4驿站币 +6 热心值 +6 收起 理由
10_avatar_small cmx006 + 1 + 1 感谢分享!
01_avatar_small 天下第一 + 1 + 1 感谢分享!
88_avatar_small 寂寞江湖 + 2 + 2 很给力!
65_avatar_small 编程者 + 2 + 2 很给力!

查看全部评分





上一篇:找师傅
下一篇:C++之stl::string写时拷贝导致的问题
08_avatar_middle
在线会员 发表于 2016-2-21 19:29:14 | 显示全部楼层
怎样在C语言程序中使用功能键和箭头键?
06_avatar_middle
在线会员 发表于 2016-2-22 12:11:48 | 显示全部楼层
怎样在C语言程序中使用功能键和箭头键
34_avatar_middle
在线会员 发表于 2016-2-23 15:34:50 | 显示全部楼层
这是提问还是普及- -
07_avatar_middle
online_vip 发表于 2016-2-26 00:59:41 | 显示全部楼层
!!!!!!!!!!!!!!!!!!!
02_avatar_middle
在线会员 发表于 2016-2-26 13:31:08 | 显示全部楼层
看看用的什么方法
65_avatar_middle
donate_vip 发表于 2016-2-26 18:42:34 | 显示全部楼层
谢谢分享啊
04_avatar_middle
在线会员 发表于 2016-2-27 20:35:01 | 显示全部楼层
正在找这个,谢谢分享!
83_avatar_middle
在线会员 发表于 2016-3-1 09:35:21 | 显示全部楼层
这是提问还是................
35_avatar_middle
在线会员 发表于 2016-3-3 02:01:42 | 显示全部楼层
这个是给我们普及呢还是给你普及呢?
88_avatar_middle
online_vip 发表于 2016-3-23 08:20:14 | 显示全部楼层
谢谢分享啊
32_avatar_middle
在线会员 发表于 2016-5-9 15:43:02 | 显示全部楼层
看看这个,谢谢楼主分享
26_avatar_middle
在线会员 发表于 2016-12-9 14:00:59 | 显示全部楼层
想学学,谢谢
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-27 22:28

Powered by Discuz! X3.4

© 2009-2019 cctry.com

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