求c语言中的bioskey的用法呀

你行你叫吴浩原 2024-06-03 23:12:36
最佳回答
bioskey(1)检测是否有键按下,没有键按下时返回0,有键按下时返回按键码(任何按键码都不为0),但此时并不将检测到的按键码从键盘缓冲队列中清除.bioskey(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未按下│└——┴———————————┴———————————┘这些都是从c函数速查中找的,大家可以从网上搜一下.bioskey()是返回键盘状态的基本函数,它拥有3个参数函数原型为:intbioskey(intcmd)其中cmd有3个参数:0,1,2各参数的用法为:当cmd是0,bioskey()返回下一个在键盘键入的值(它将等待到按下一个键)。它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的低8位数存放该字符的ascii码;对于特殊键(如方向键、f1~f12等等),低8位为0,高8位字节存放该键的扫描码。cmd=1:当cmd是1,bioskey()查询是否按下一个键,若按下一个键则返回非零值,否则返回0。cmd=2:当cmd是2,bioskey()返回shift、ctrl、alt、scrolllock、numlock、capslock、insert键的状态。各键状态存放在返回值的低8位字节中。字节位含义0右边shift键状态1左边shift键状态3ctrl键状态4alt键状态5scrolllock键状态6numlock键状态7capslock键状态8insert键状态bioskey函数函数原型:intbioskey(intcmd);函数功能:利用函数bioskey可以实现三种功能,参数cmd为要实现的功能号,值只能为0、1、2,具体含义如下:0:在系统中有一个按键队列,所有的键盘按键都在这里排成队。该功能就是如果按键队列中有按键,那么读取队列首位的按键,并返回按键值;否则等待键盘按键出现。(其中按键值的高字节为扫描码,低字节为ascii码)1:如果按键队列中没有按键,那么返回零,否则返回非零。2:返回特殊按键shift、ctrl、alt等键的按键状态bioskey函数用于从内存中读取一个按键的scancode值.格式是:intbioskey(intcmd)参数cmd取值:0:读取scancode,并从内存中删除,如果没有按键则等待.1:读取scancode,但不从内存中删除(其它函数可以继续使用),如果无按键则返回02:返加shiftaltctrl键的状态按下shift返回1,按下ctrl返回4,按下alt返回8,如果是shift+ctrl则返回5(相加),依此类推....下面是一个例子:#include<bios.h>main(){while(!kbhit()){printf("%d,%d",bioskey(0),bioskey(2));}}注意:这是一个死循环,因为参数0表示接收按键码,但将其清除,所以kbhit()函数就接收不到按键了.可按ctrl+break组合键来终止这个程序.然后将bioskey(0)改为bioskey(1),如果不按键将显示0,若按键则立即结束函数名:bioskey功能:直接使用bios服务的键盘接口函数原型:intbioskey(intcmd)说明:bioskey()的函数原型在bios.h中bioskey()完成直接键盘操作,cmd的值决定执行什么操作。cmd=0:当cmd是0,bioskey()返回下一个在键盘键入的值(它将等待到按下一个键)。它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的低8位数存放该字符的ascii码;对于特殊键(如方向键、f1~f12等等),低8位为0,高8位字节存放该键的扫描码。cmd=1:当cmd是1,bioskey()查询是否按下一个键,若按下一个键则返回非零值,否则返回0。cmd=2:当cmd是2,bioskey()返回shift、ctrl、alt、scrolllock、numlock、capslock、insert键的状态。各键状态存放在返回值的低8位字节中。字节位含义0右边shift键状态1左边shift键状态3ctrl键状态4alt键状态5scrolllock键状态6numlock键状态7capslock键状态8insert键状态字节位为1表示该键被按下,为0表示松开。程序例:#include<stdio.h>#include<bios.h>#include<ctype.h>#defineright0x01#defineleft0x02#definectrl0x04#definealt0x08intmain(void){intkey,modifiers;/*function1returns0untilakey**pressed*/while(bioskey(1)==0);/*function0returnsthekeythat**waiting*/key=bioskey(0);/*usefunction2todetermineifshiftkeyswereused*/modifiers=bioskey(2);if(modifiers){printf("[");if(modifiers&right)printf("right");if(modifiers&left)printf("left");if(modifiers&ctrl)printf("ctrl");if(modifiers&alt)printf("alt");printf("]");}/*printoutthecharacterread*/if(**alnum(key&0xff))printf("'%c'",key);elseprintf("%#02x",key);return0;}bioskey返回的值有两种情况。就ascii而言:按一个按键会有两种情况发生。1.按一个按键,产生一个ascii,这样bioskey返回的值就是:hi:扫描码,lo:ascii2.按一个按键,产生两个ascii,一个是0,另一个是每个键不同的ascii,bioskey的返回值就是:hi:ascii,lo:0有很多键没有ascii,例如shift,ctrl,capslock等,但是他们有扫描码,只要是按键就有扫描码。扫描码和ascii是完全不同的两个概念,是硬件识别键盘的编码,每个按键都有固定的扫描码,用来区别每个按键,不同的按键的扫描码都不同。两个按键的ascii有可能相同,但是扫描码一定不同,只要是两个键,扫描码就不同,例如两个回车,ascii相同,但是扫描码不同。我以前的程序编过一段扫描码,贴出来给你看看:(7年前编的,本来是我当时想做的一个游戏引擎的一段程序,可以判断和处理键盘上任意多个键同时按下/抬起的情况,可惜因种种原因中断了,因dos程序,现在也没什么意义了)扫描码的d7位为0,表示这个按键被按下产生的中断,d7为1表示这个按键被抬起产生的中断。//特殊按键//pause=0xe145/0xe1c5(0xe1,0x1d(ctrl),0x45(numlock)-0xe1,0x9d,0xc5)//break=0xe046/0xe0c6(0xe0,scrolllock)//prtsc=0xe037/0xe0b7(0xe0,keypad-*)//sysrq=ctrl-prtsccharpausekeyname={"**",//00"esc",//01"1!",//02"2@",//03"3#",//04"4$",//05"5%",//06"6^",//07"7&",//08"8*",//09"9(",//0a"0)",//0b"-_",//0c"+=",//0d"backspace",//0e"tab",//0f"q",//10"w",//11"e",//12"r",//13"t",//14"y",//15"u",//16"i",//17"o",//18"p",//19"}",//1b"enter",//1c"l-ctrl",//1d"a",//1e"s",//1f"d",//20"f",//21"g",//22"h",//23"j",//24"k",//25"l",//26";:",//27"""",//28"`~",//29"l-shift",//2a"\|",//2b"z",//2c"x",//2d"c",//2e"v",//2f"b",//30"n",//31"m",//32",<",//33".>",//34"/?",//35"r-shift",//36"*",//37"l-alt",//38"space",//39"capslock",//3a"f1",//3b"f2",//3c"f3",//3d"f4",//3e"f5",//3f"f6",//40"f7",//41"f8",//42"f9",//43"f10",//44"numlock",//45"scrolllock",//46"7home",//47"8up",//48"9pgup",//49"-",//4a"4left",//4b"5",//4c"6right",//4d"+",//4e"1end",//4f"2down",//50"**gdn",//51"0ins",//52".del",//53"prtsc(alt)",//54"???55h",//55"added\|",//56"f11",//57"f12",//58"???59h",//59"???5ah",//5a"???5bh",//5b"???5ch",//5c"???5dh",//5d"???5eh",//5e"???5fh",//5f"???60h",//60"???61h",//61"???62h",//62"???63h",//63};charkeynamese0={"**",//e000"???e001h",//e001"???e002h",//e002"???e003h",//e003"???e004h",//e004"???e005h",//e005"???e006h",//e006"???e007h",//e007"???e008h",//e008"???e009h",//e009"???e00ah",//e00a"???e00bh",//e00b"???e00ch",//e00c"???e00dh",//e00d"???e00eh",//e00e"???e00fh",//e00f"???e010h",//e010"???e011h",//e011"???e012h",//e012"???e013h",//e013"???e014h",//e014"???e015h",//e015"???e016h",//e016"???e017h",//e017"???e018h",//e018"???e019h",//e019"???e01ah",//e01a"???e01bh",//e01b"enter",//e01c"r-ctrl",//e01d"???e01eh",//e01e"???e01fh",//e01f"???e020h",//e020"???e021h",//e021"???e022h",//e022"???e023h",//e023"???e024h",//e024"???e025h",//e025"???e026h",//e026"???e027h",//e027"???e028h",//e028"???e029h",//e029"???e02ah",//e02a"???e02bh",//e02b"???e02ch",//e02c"???e02dh",//e02d"???e02eh",//e02e"???e02fh",//e02f"???e030h",//e030"???e031h",//e031"???e032h",//e032"???e033h",//e033"???e034h",//e034"/",//e035"???e036h",//e036"prtsc",//e037"r-alt",//e038"???e039h",//e039"???e03ah",//e03a"???e03bh",//e03b"???e03ch",//e03c"???e03dh",//e03d"???e03eh",//e03e"???e03fh",//e03f"???e040h",//e040"???e041h",//e041"???e042h",//e042"???e043h",//e043"???e044h",//e044"???e045h",//e045"break",//e046"home",//e047"up",//e048"pageup",//e049"???e04ah",//e04a"left",//e04b"???e04ch",//e04c"right",//e04d"???e04eh",//e04e"end",//e04f"down",//e050"pagedown",//e051"insert",//e052"delete",//e053"???e054h",//e054"???e055h",//e055"???e056h",//e056"???e057h",//e057"???e058h",//e058"???e059h",//e059"???e05ah",//e05a"l-start95",//e05b"r-start95",//e05c"menu95",//e05d"power",//e05e"sleep",//e05f"???e060",//e060"???e061",//e061"???e062",//e062"wakeup",//e063};得到扫描码的方法:拦截键盘硬体中断,计算的结果保存在keyscancode里,keyboardproc();就是处理这个值的函数。unsignedfar*_key_flags=(unsignedfar*)0x00000417l;unsignedfar*_key_flags1=(unsignedfar*)0x00000496l;unsignedintfarkeyscancode=0;unsignedcharfarkeyscbuffer={0,0,0,0};unsignedcharfarkeytempchar=0;voidinterruptnewkb09(...){asmclikeytempchar=inportb(0x60);keyscbuffer=keyscbuffer;keyscbuffer=keyscbuffer;keyscbuffer=keyscbuffer;keyscbuffer=keytempchar;keytempchar=inportb(0x61);outportb(0x61,keytempchar|0x80);outportb(0x61,keytempchar&0x7f);if((keyscbuffer!=0xe0)&&(keyscbuffer!=0xe1)){keyscancode=keyscbuffer;if(keyscbuffer==0xe0)keyscancode|=0xe000;if((keyscbuffer==0xe1)&&((keyscbuffer==0x1d)||(keyscbuffer==0x9d)))keyscancode|=0xe100;if((keyscancode!=0xe02a)&&(keyscancode!=0xe0aa)&&(keyscancode!=0xe036)&&(keyscancode!=0xe0b6)&&(keyscbuffer!=0xe1))keyboardproc();}asmstioutportb(0x20,0x20);}//这是一段测试程序,可以显示出当前按下或者抬起那个按键:charfmtksccode="%-10s";charfmtunkname="scancode:";charstrkeyname="pressanykeyoresctoquit...";charbyestr);}else{cprintf(fmtkeyname,keynames00);}}else{cprintf(fmtunkname,kscode&0xff7f);}textcolor(lightblue);cprintf(strwait);kscode=0;}}textcolor(lightgray);cprintf(byestr);resoldkb();return0;}top 20210311
汇率兑换计算器

类似问答
  • c++/cli的语法
    • 2024-06-03 14:39:54
    • 提问者: 未知
    c++/cli(cli:common language infrastructure)是一门用来代替c++托管扩展(下文使用mc+指代)新的语言规范。重新简化了c++托管扩展的语法,提供了更好的代码可读性。和微软.net的其他语言一样,微软向ecma提交了c++/cli的标准。c++/cli现在可以在v**ual c++ 2005上开发。c++/cli的部分特性...
  • 关于c语言long的用法
    • 2024-06-03 16:49:20
    • 提问者: 未知
    1. 声明.long s=1, a, m=1, n, i;2. 输.scanf("%ld %ld", &a, &n);这个输入的格式要看好(1)long对应的是%ld.(2).当"%ld,%ld"中间有,在输入的时候要输入逗号,比如输入2,3,没有逗号的话,中间用空格隔开********************************************...
  • 【c语言】一道简单的c语言选择题m1-25
    • 2024-06-03 14:00:01
    • 提问者: 未知
    (c+c++,c+8,c++)c+c++=>c++的结果是6(后自加表示先赋值后加1,前自加反之),所以c+c++的结果是10 c+8,对结果没影响 c++的结果是11 所以是13 我的理解是这样 不知道对...
  • 汇编语言中out和in的用法
    • 2024-06-03 16:16:03
    • 提问者: 未知
    out 和 in 在汇编中是端写指令。端口是主外设进行数据使用的,分为数据端口态端口和控制端口三种。 pc机给每一个端口分配了一个地址,所有端口成线性排列,形成一个独立于内存空间的i/o地址空间,一般用十六进制表示。8086中,端口地址的范围是0000h-ffffh。 例如: in al, 21h 表示从21h端口读一个字节数据到al; out 21h,al 表示将al持有的数据写入21h端口 那...
  • c语言中%dd是什么意思
    • 2024-06-03 07:38:00
    • 提问者: 未知
    尚遗枯蜕a
  • c语言中%dd是什么意思
    • 2024-06-03 10:20:37
    • 提问者: 未知
    斜横花树小
  • c语言问题,求详解
    • 2024-06-03 16:52:58
    • 提问者: 未知
    a中,10,000,中间不能有逗号 b中,0abc,不能以0开头 c中,028不合法,不能以0开头 d中,全部合法
  • 杭电1002 c语言
    • 2024-06-03 08:33:38
    • 提问者: 未知
    #include <stdio.h>#include <string.h>main(){char str1[1001],str2[1001];int t,i,len_str1,len_str2,len_max,num=1,k;scanf("%d",&t);getchar();while(t--){int a[1001]={0},b[1001]={0},c...
  • 敢死队问题,跪求c语言代码
    • 2024-06-03 23:26:53
    • 提问者: 未知
    展开全部#include define n 40/假设不超过40人 int last(int m,int n){ int a[n];int i,count=0,total=0;for(i=0;i;i+)a[i]=1;i=0;while(total!m){ count+a[i];if(count=n){ count=0;a[i]=0;total+;if(total=m)return i;} i+;i...
  • c语言提供的合法**是
    • 2024-06-03 14:36:28
    • 提问者: 未知
    由ansi标准定义c语言**共32个 : auto double int struct break else long switch case enum reg**ter typedef char extern return union const float short unsigned continue for signed void default goto sizeof vola...
汇率兑换计算器

热门推荐
热门问答
最新问答
推荐问答
新手帮助
常见问题
房贷计算器-九子财经 | 备案号: 桂ICP备19010581号-1 商务联系 企鹅:2790-680461

特别声明:本网为公益网站,人人都可发布,所有内容为会员自行上传发布",本站不承担任何法律责任,如内容有该作者著作权或违规内容,请联系我们清空删除。