-- 作者:卷积内核
-- 发布时间:12/11/2008 9:44:00 AM
-- Dos下键盘的完全控制 ------- 一系列的BIOS级别的键盘控制函数!
#ifndef XRH_KEYS_H #define XRH_KEYS_H /* Topic: This is The KeyBoard Controlling Functions Set [Author:superspirit] ******************************* * SuperSpirit Software Studio * ******************************* modified date: 2001-10-11 ----------------------------------------------------------------------------- Including 6 function: <Marked With '!!!!!' at below.> 1> void Clean_Kb_Buf(void) *** Cleaning The KeyBord Buffer *** 2> void Get_Key(void) *** Geting The Key's Ascii And ScanCode *** 3> int Detect_Key(void) *** Detecting The Key Pressing And Geting Key *** 4> void Get_KB_State(void) *** Getting The KeyBoard Status *** 5> void Send_Key(char far *Key_p) *** Send Some Key To KeyBoard Buffer *** 6> void Set_Key (char AscII,char ScanCode) *** Send One Character To Key Board Buffer *** */ #include <DOS.H> #define ZERO_FLAG 0x040 /* '0000000001000000',ZeroFlag in FLAG_REGISTER */ #define KEYBOARD 0x16 /* KeyBoard Interrupt Number */ /*Below:Defined For Register 'AL' */ #define R_SHIFT_PRESSED 0x01 #define L_SHIFT_PRESSED 0x02 #define CTRL_PRESSED 0x04 #define ALT_PREESED 0x08 #define SCROLL_ENABLED 0x10 #define NUM_ENABLED 0x20 #define CAPS_ENABLED 0x40 #define INSERT_PRESSED 0x80 /*Below:Defined For Register 'AH' */ #define L_CTRL_PRESSED 0x01 #define L_ALT_PRESSED 0x02 #define R_CTRL_PRESSED 0x04 #define R_ALT_PRESSED 0x08 #define SCROLL_PRESSED 0x10 #define NUM_PRESSED 0x20 #define CAPS_PRESSED 0x40 #define PRINT_PRESSED 0x80 /**************************/ int KeyCode_Num=73; unsigned char KeyCode[74][2]={ 27, 1, '1', 2, '!', 2, '2', 3, '@', 3, '3', 4, '#', 4, '4', 5, '$', 5, '5', 6, '%', 6, '6', 7, '^', 7, '7', 8, '&', 8, '8', 9, '*', 9, '9',10, '(',10, '0',11, ')',11, '-',12, '_',12, '=',13, '+',13, '\',43, '|',43, '`',41, '~',41, 8 ,14, 9 ,15, 'A',30, 'B',48, 'C',46, 'D',32, 'E',18, 'F',33, 'G',34, 'H',35, 'I',23, 'J',36, 'K',37, 'L',38, 'M',50, 'N',49, 'O',24, 'P',25, 'Q',16, 'R',19, 'S',31, 'T',20, 'U',22, 'V',47, 'W',17, 'X',45, 'Y',21, 'Z',44, ',',51, '<',51, '.',52, '>',52, '/',53, '?',53, ';',39, ':',39, 39,40, '"',40, '[',26, '{',26, ']',27, '}',27, 13,28, ' ',37, 0, 0, }; typedef union { unsigned int Key_Num; unsigned char Either[2]; }KB_Key; typedef union { unsigned char Pressed[2];/* Pressed[0] is LEFT,Pressed[1] is RIGHT */ unsigned IsPressed; } Press_It_1; typedef struct{ unsigned char Pressed; unsigned char Enabled; } Press_It_2; typedef struct{ Press_It_1 Shift , Ctrl , Alt ; Press_It_2 Scroll, Num , Caps; unsigned char Insert, Print; } KeyBoard_State; /**************************************************************************/ KB_Key The_Key; /* Define Static Symbol Holding KeyBoard Status. */ KeyBoard_State KB_State; union REGS in_regs,out_regs; /* Get KeyBoard Buffer Pointer */ unsigned far *Kb_Buf_Start=(unsigned far *)0x00400080; unsigned far *Kb_Buf_End =(unsigned far *)0x00400082; unsigned far *Kb_Buf_Head =(unsigned far *)0x0040001A; unsigned far *Kb_Buf_Tail =(unsigned far *)0x0040001C; char far *Kb_Buf_Ascii=( char far *)0x00400000; char far *Kb_Buf_ScanCode=(char far *)0x00400000; /*********!!!!!**************/ void Set_Key(char Ascii,char ScanCode) { Kb_Buf_Ascii[*Kb_Buf_Tail]=Ascii; Kb_Buf_ScanCode[*Kb_Buf_Tail+1]=ScanCode; *Kb_Buf_Tail+=2; if(*Kb_Buf_Tail>=*Kb_Buf_End) *Kb_Buf_Tail=*Kb_Buf_Start; return; } void KeyCode_Sort(void) { int i=0,j=0,Flag; unsigned char Mid[2]; if(KeyCode[KeyCode_Num][0]) return; for(i=0;i<KeyCode_Num-1;i++) { Flag=0; for(j=0;j<KeyCode_Num-1-i;j++) { if(KeyCode[j][0]>KeyCode[j+1][0]) { Flag=1; Mid[0]=KeyCode[j][0]; Mid[1]=KeyCode[j][1]; KeyCode[j][0]=KeyCode[j+1][0]; KeyCode[j][1]=KeyCode[j+1][1]; KeyCode[j+1][0]=Mid[0]; KeyCode[j+1][1]=Mid[1]; } } if(!Flag) break; } KeyCode[KeyCode_Num][0]=1; return; } int KeyCode_Find(char Ch) { int Start=0,End=KeyCode_Num-1; int Now=0; if(Ch>='a'&&Ch<='z') Ch-=32; while(1) { Now=(Start+End)/2; if(Start>End) return -1; if(Ch>KeyCode[Now][0]) { Start=Now+1;continue; } if(Ch<KeyCode[Now][0]) { End=Now-1;continue; } if(Ch==KeyCode[Now][0]) { return Now; } } } /********!!!!!!!!!*********/ void Send_Key(char far *Key_p) /* Send Some Key To KeyBoard Buffer,As Input From KeyBoard?*/ { int i=0; KeyCode_Sort(); for(;*Key_p;Key_p++) { i=KeyCode_Find(*Key_p); if(i>=0) Set_Key(*Key_p,KeyCode[i][1]); } return; } /************!!!!!!!!!!*********/ void Clean_Kb_Buf(void) /*** Cleaning The KeyBord Buffer ***/ { *Kb_Buf_Head=*Kb_Buf_Tail; } /**********************/ void Adjust(void) { if(The_Key.Either[0]==0xE0) The_Key.Either[0]=0; return; } /*******!!!!!********/ void Get_Key(void) /* Get Key's ASCII & Key's Scancode */ { in_regs.h.ah=0x10; int86(KEYBOARD,&in_regs,&out_regs); The_Key.Key_Num=out_regs.x.ax; /*ASCII is in Either[0],ScanCode is in Either[1]*/ Adjust(); return; } /*******!!!!!*****************/ int Detect_Key(void) /* Detect If A Key Be Preesed Now */ { in_regs.h.ah=0x11; int86(KEYBOARD,&in_regs,&out_regs); if(out_regs.x.flags&ZERO_FLAG) return (0); The_Key.Key_Num=out_regs.x.ax; /* ASCII is in Either[0],ScanCode is in Either[1] */ Adjust(); return(1); } /************!!!!!*************************/ /*char far *KeyState=(char far *) ((unsigned long )(0x40<<16)+0x17);*/ char far *KeyState=(char far*)MK_FP(0x0040,0x0017); /* Bios Data Area 0040:0017 KeyBoard Control Key Status: ( 1 Byte,8 Bits) bit 0: Right 'Shift' Key--- 1 -> Pressed,0-> Unpressed bit 1: Left 'Shift' Key--- 1 -> Pressed,0-> Unpressed bit 2: 'Ctrl' Key --- 1 -> pressed,0-> Unpressed bit 3: 'Alt' Key --- 1 -> pressed,0-> Unpressed bit 4: 'Scroll Lock Key'--- 1 -> Open ,0-> Close bit 5: 'Num Lock Key' --- 1 -> Open ,0-> Close bit 6: 'Caps Lock Key --- 1 -> Open ,0-> Close bit 7: 'Insert Lock Key --- 1 -> Open ,0-> Close */ void Get_KB_State(void) /* Get KeyBoard's Status To a Symbol 'KB_State'<Which is a sturcture.> */ { if(Detect_Key()) Get_Key(); in_regs.h.ah=0x12; int86(KEYBOARD,&in_regs,&out_regs); /* KeyBoard Interrupter */ /***** Below is Geting State of KeyBord ****************/ KB_State.Shift.Pressed[1]=out_regs.h.al & R_SHIFT_PRESSED; KB_State.Shift.Pressed[0]=out_regs.h.al & L_SHIFT_PRESSED; KB_State.Ctrl.Pressed[1] =out_regs.h.ah & R_CTRL_PRESSED; KB_State.Ctrl.Pressed[0] =out_regs.h.ah & L_CTRL_PRESSED; KB_State.Alt.Pressed[1] =out_regs.h.ah & R_ALT_PRESSED; KB_State.Alt.Pressed[0] =out_regs.h.ah & L_ALT_PRESSED; KB_State.Scroll.Pressed =out_regs.h.ah & SCROLL_PRESSED; KB_State.Scroll.Enabled =out_regs.h.al & SCROLL_ENABLED; KB_State.Num.Pressed =out_regs.h.ah & NUM_PRESSED; KB_State.Num.Enabled =out_regs.h.al & NUM_ENABLED; KB_State.Caps.Pressed =out_regs.h.ah & CAPS_PRESSED; KB_State.Caps.Enabled =out_regs.h.al & CAPS_ENABLED; KB_State.Insert =out_regs.h.al & INSERT_PRESSED; KB_State.Print =out_regs.h.ah & PRINT_PRESSED; return; } /************ ===== Fouctions End ===== *************/ /*** Testing *********************************/ /* test 1 */ /* main() { int i=0; Get_KB_State(); while(!kbhit()) { Get_KB_State(); if(KB_State.Insert||KB_State.Print||KB_State.Shift.IsPressed ||KB_State.Ctrl.IsPressed ||KB_State.Alt.IsPressed||KB_State.Scroll.Pressed ||KB_State.Num.Pressed||KB_State.Caps.Pressed) { i++; printf("**************************************************************%d %s",i,(i>1)?"Times":"Time"); printf("KB_State.Shift.R_Pressed:%d",KB_State.Shift.Pressed[1]); printf("KB_State.Shift.L_Pressed:%d",KB_State.Shift.Pressed[0]); printf("KB_State.Ctrl.R_Pressed :%d",KB_State.Ctrl.Pressed[1] ); printf("KB_State.Ctrl.L_Pressed :%d",KB_State.Ctrl.Pressed[0] ); printf("KB_State.Alt.R_Pressed :%d",KB_State.Alt.Pressed[1] ); printf("KB_State.Alt.L_Pressed :%d", KB_State.Alt.Pressed[0] ); printf("KB_State.Scroll.Pressed :%d",KB_State.Scroll.Pressed ); printf("KB_State.Scroll.Enabled :%d",KB_State.Scroll.Enabled ); printf("KB_State.Num.Pressed :%d", KB_State.Num.Pressed ); printf("KB_State.Num.Enabled :%d", KB_State.Num.Enabled ); printf("KB_State.Caps.Pressed :%d", KB_State.Caps.Pressed ); printf("KB_State.Caps.Enabled :%d", KB_State.Caps.Enabled ); printf("KB_State.Insert :%d", KB_State.Insert ); printf("KB_State.Print :%d", KB_State.Print ); } delay(5000); } return ; } */ /* test 2 */ /* main() { int i; clrscr(); while(1) { if(Detect_Key()) { clrscr(); printf("<%c,%x>,(%x,%x)[%x,%x]",The_Key.Either[0],The_Key.Either[1],*Kb_Buf_Head,*Kb_Buf_Tail,*Kb_Buf_Start,*Kb_Buf_End ); Clean_Kb_Buf(); delay (30000); } printf("fslfsf"); if(The_Key.Either[0]==27) break; } } */ /* test 3 */ /* main() { Detect_Key(); Key(); clrscr(); printf("<%x,%x>,(%x,%x)",*Kb_Buf_Start,*Kb_Buf_End,*Kb_Buf_Head,*Kb_Buf_Tail); getch(); }*/ #endif
|