你行你叫吴浩原
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