Dos下键盘的完全控制 ------- 一系列的BIOS级别的键盘控制函数!

类别:VC语言 点击:0 评论:0 推荐:

#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\n",i,(i>1)?"Times":"Time");
 printf("KB_State.Shift.R_Pressed:%d\n",KB_State.Shift.Pressed[1]);
 printf("KB_State.Shift.L_Pressed:%d\n",KB_State.Shift.Pressed[0]);
 printf("KB_State.Ctrl.R_Pressed :%d\n",KB_State.Ctrl.Pressed[1] );
 printf("KB_State.Ctrl.L_Pressed :%d\n",KB_State.Ctrl.Pressed[0] );
 printf("KB_State.Alt.R_Pressed  :%d\n",KB_State.Alt.Pressed[1]  );
 printf("KB_State.Alt.L_Pressed  :%d\n", KB_State.Alt.Pressed[0] );
 printf("KB_State.Scroll.Pressed :%d\n",KB_State.Scroll.Pressed  );
 printf("KB_State.Scroll.Enabled :%d\n",KB_State.Scroll.Enabled  );
 printf("KB_State.Num.Pressed    :%d\n", KB_State.Num.Pressed    );
 printf("KB_State.Num.Enabled    :%d\n", KB_State.Num.Enabled    );
 printf("KB_State.Caps.Pressed   :%d\n",  KB_State.Caps.Pressed  );
 printf("KB_State.Caps.Enabled   :%d\n", KB_State.Caps.Enabled   );
 printf("KB_State.Insert         :%d\n", KB_State.Insert         );
 printf("KB_State.Print          :%d\n", 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

本文地址:http://com.8s8s.com/it/it3546.htm