关于bioskey()函数据的一个问题

xiaoweiwsh 2002-07-31 10:44:06
键盘响应函数如下

int specialkey()
{
int key;
while(bioskey(1)==0);
key=bioskey(0);
key=key&0xff?key&0xff:key>>8;
return(key);
}

为什么先要用while循环?该函数是如何解决键盘的组何键的情况的?
...全文
145 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoweiwsh 2002-07-31
  • 打赏
  • 举报
回复
书上说bioskey()返回一个16位二进制数,当按下一个普通键时它的低8位数存放该字的ASCⅡ码(些时高位是否为0?),对于特殊键(包括箭头,功能键)低8位为0,高8位存放该键的扫描码(扫描码是什么东西?为什么用上面函数specialkey()时,当按下ALT+X时返回45?)
另外,程序中while语句循环的作用是不是等待按键(一直循环直到有按键bioskey()返回0跳出循环?),如果是接下来的bioskey()返回的是那个按键的值?
liushmh 2002-07-31
  • 打赏
  • 举报
回复
为什么先要用while循环?
因为 要确认你是否按键,
key=bioskey(0);该语句为获得键值
key=key&0xff?key&0xff:key>>8;该语句表示如果 key的低8位不全为零
则返回低8位,否则返回高8位。



0xff 2002-07-31
  • 打赏
  • 举报
回复
用while是因为bioskey(1)是检测是否按键~不像getch()会等待按键
解决键盘的组何键的情况要用bioskey(2),详见TC的帮助~
xiaoweiwsh 2002-07-31
  • 打赏
  • 举报
回复
谢谢啦
dcyu 2002-07-31
  • 打赏
  • 举报
回复
ALT+ ?(表示字符或数字)的低8位是零,高8位是扫描码,ALT_X的扫描码是0x2d(45)。按照程序key=key&0xff?key&0xff:key>>8,可知
ALT+X的全码应当是0x2d00,与0xff取与运算,为零,返回key>>8,key右移8位就是0x2d.再赋给key,就是45了。
xiaoweiwsh 2002-07-31
  • 打赏
  • 举报
回复
还有一点小问题,当键盘输入ALT+X时上面的程序是如何得出45的?
dcyu 2002-07-31
  • 打赏
  • 举报
回复
bioskey函数用法如下:
int bioskey(int cmd)本函数用来执行各种键盘操作,由cmd确定操作。
cmd可为以下值:
0 返回敲键盘上的下一个键。若低8位为非0,即为ASCII字符;若低8位为0,
则返回扩充了的键盘代码。
1 测试键盘是否可用于读。返回0表示没有键可用;否则返回下一次敲键之值。
敲键本身一直保持由下次调用具的cmd值为0的bioskey所返回的值。
2 返回当前的键盘状态,由返回整数的每一个位表示,见下表:
┌──┬───────────┬───────────┐
│ 位 │为0时意义 │为1时意义 │
├──┼───────────┼───────────┤
│ 7 │插入状态 │改写状态 │
│ 6 │大写状态 │小写状态 │
│ 5 │数字状态,NumLock灯亮 │光标状态,NumLock灯熄 │
│ 4 │ScrollLock灯亮 │ScrollLock灯熄 │
│ 3 │Alt按下 │Alt未按下 │
│ 2 │Ctrl按下 │Ctrl未按下 │
│ 1 │左Shift按下 │左Shift未按下 │
│ 0 │右Shift按下 │右Shift未按下 │
└──┴───────────┴───────────┘
ckc 2002-07-31
  • 打赏
  • 举报
回复
其实这while完全多余
直接用BIOSKEY(0)就可以了
0和1的不同仅在于0是只有按下了键才会返回
1是当前键盘缓冲区没有键就返回0,如果有键就返回此键的扫描码和ASCII码,注意1并不从缓冲区中清除此键,所以你下次调用0或者1还可以读到这个键值
这两句放在一起这样用没什么意思,直接用第二句就可以了

返回值高位一直都放扫描码,扫描码是键盘的物理编码,每个键都有扫描码
象F1这样的键没有ASCII码,就只有扫描码
hansonhx 2002-07-31
  • 打赏
  • 举报
回复
@_@

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧