⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.h

📁 这个版本修正了已知的Bug,同时添加了部分函数
💻 H
字号:
#include<dos.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>


#define KEY_WINDOWS 223
#define KEY_CTRLBREAK 248

#define KB_SHIFT_FLAG         0x0001
#define KB_CTRL_FLAG          0x0002
#define KB_ALT_FLAG           0x0004
#define KB_LWIN_FLAG          0x0008
#define KB_RWIN_FLAG          0x0010
#define KB_MENU_FLAG          0x0020
#define KB_SCROLOCK_FLAG      0x0100
#define KB_NUMLOCK_FLAG       0x0200
#define KB_CAPSLOCK_FLAG      0x0400
#define KB_INALTSEQ_FLAG      0x0800
#define KB_ACCENT1_FLAG       0x1000
#define KB_ACCENT1_S_FLAG     0x2000
#define KB_ACCENT2_FLAG       0x4000
#define KB_ACCENT2_S_FLAG     0x8000

//-------------------以上定义不要使用,否则...哼哼..-------------------------

#define KB_NORMAL             1
#define KB_EXTENDED           2

#define ESC      1
#define UP       72
#define LEFT     75
#define RIGHT    77
#define DOWN     80
#define ENTER    28
#define SPACE    57
#define ALT      56
#define CTRL     29

#define KEY_ESC               1     /* keyboard scan codes  */
#define KEY_1                 2 
#define KEY_2                 3 
#define KEY_3                 4
#define KEY_4                 5
#define KEY_5                 6
#define KEY_6                 7
#define KEY_7                 8
#define KEY_8                 9
#define KEY_9                 10
#define KEY_0                 11
#define KEY_MINUS             12
#define KEY_EQUALS            13
#define KEY_BACKSPACE         14
#define KEY_TAB               15 
#define KEY_Q                 16
#define KEY_W                 17
#define KEY_E                 18
#define KEY_R                 19
#define KEY_T                 20
#define KEY_Y                 21
#define KEY_U                 22
#define KEY_I                 23
#define KEY_O                 24
#define KEY_P                 25
#define KEY_OPENBRACE         26
#define KEY_CLOSEBRACE        27
#define KEY_ENTER             28
#define KEY_RIGHTCTRL         29
#define KEY_LEFTCTRL          29
#define KEY_A                 30
#define KEY_S                 31
#define KEY_D                 32
#define KEY_F                 33
#define KEY_G                 34
#define KEY_H                 35
#define KEY_J                 36
#define KEY_K                 37
#define KEY_L                 38
#define KEY_COLON             39
#define KEY_QUOTE             40
#define KEY_TILDE             41
#define KEY_LEFTSHIFT         42
#define KEY_BACKSLASH         43
#define KEY_Z                 44
#define KEY_X                 45
#define KEY_C                 46
#define KEY_V                 47
#define KEY_B                 48
#define KEY_N                 49
#define KEY_M                 50
#define KEY_COMMA             51
#define KEY_STOP              52
#define KEY_SLASH             53
#define KEY_RIGHTSHIFT        54
#define KEY_ASTERISK          55
#define KEY_LEFTALT           56
#define KEY_RIGHTALT          56
#define KEY_SPACE             57
#define KEY_CAPSLOCK          58
#define KEY_F1                59
#define KEY_F2                60
#define KEY_F3                61
#define KEY_F4                62
#define KEY_F5                63
#define KEY_F6                64
#define KEY_F7                65
#define KEY_F8                66
#define KEY_F9                67
#define KEY_F10               68
#define KEY_NUMLOCK           69
#define KEY_SCRLOCK           70
#define KEY_HOME              71
#define KEY_UP                72
#define KEY_PGUP              73
#define KEY_MINUS_PAD         74
#define KEY_LEFT              75
#define KEY_5_PAD             76
#define KEY_RIGHT             77
#define KEY_PLUS_PAD          78
#define KEY_END               79
#define KEY_DOWN              80
#define KEY_PGDN              81
#define KEY_INSERT            82
#define KEY_DEL               83
#define KEY_PRTSCR            84
#define KEY_F11               87
#define KEY_F12               88
#define KEY_LWIN              91
#define KEY_RWIN              92
#define KEY_MENU              93
#define KEY_PAD               100
#define KEY_RCONTROL          120
#define KEY_ALTGR             121
#define KEY_SLASH2            122
#define KEY_PAUSE             123

/*-------------------------------------------------------------------------------*/
static unsigned char asciinames[]={
    0,27,'1','2','3','4','5','6','7','8','9','0','-','=',8,9,
    'q','w','e','r','t','y','u','i','o','p','[',']',13,KEY_LEFTCTRL,'a','s',
    'd','f','g','h','j','k','l',';',39,'`',0,92,'z','x','c','v',
    'b','n','m',',','.','/',0,'*',KEY_LEFTALT,' ',KEY_CAPSLOCK,KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,
    KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_NUMLOCK,KEY_SCRLOCK,'7','8','9','-','4','5','6','+','1',
    '2','3','0',127,0,0,'\\',KEY_F11,KEY_F12,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
            };
/*-------------------------------------------------------------------------------*/
static char specialnames[]={
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,13,KEY_RIGHTCTRL,0,0,
    0,0,0,0,0,0,0,0,0,0,KEY_WINDOWS,0,0,0,0,0,
    0,0,0,0,0,'/',0,KEY_PRTSCR,KEY_RIGHTALT,0,0,0,0,0,0,0,
    0,0,0,0,0,0,KEY_CTRLBREAK,KEY_HOME,KEY_UP,KEY_PGUP,0,KEY_LEFT,0,KEY_RIGHT,0,KEY_END,
    KEY_DOWN,KEY_PGDN,KEY_INSERT,KEY_DEL,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                };
/*-------------------------------------------------------------------------------*/
unsigned char pause_key;
unsigned char key_ascii;
unsigned char key_scan;
unsigned char caps;
unsigned char cur_code,key_code;
static   char key_press=0;
void interrupt (*_old_key_interrupt)();
/*-------------------------------------------------------------------------------*/
//设置按键重复速率
void setkeyspeed()
{
    REGS regs;
    regs.w.bx=0x0;
    regs.w.ax=0x0A05;
    int386 (0x16,&regs,&regs);
}
/*-------------------------------------------------------------------------------*/
//清除键盘缓冲区
void clear_keybuf()
{
    key_scan=0;
    key_ascii=0;
    memset(KEY,0,sizeof(KEY));
    key_press=0;
     char *p1=(char*)1050;
     char *p2=(char*)1052;
      if(*p1!=*p2)
      *p1=*p2;
}
/*-------------------------------------------------------------------------------*/
void interrupt key_interrupt(void)
{
_disable();
//(*_old_key_interrupt)();
unsigned char specialflag;
unsigned char k,c,temp;
k=inp(0x60);
outp(0x61,(temp=inp(0x61))|0x80);
outp(0x61,temp);
if(k==0xe0)specialflag=1;
else if(k==0xe1)pause_key=1;
else
{
    if(k&0x80)
    {
        k&=0x7f;
        KEY[k]=0;
        key_press=0;
    }
    else
    {
        key_code=cur_code;
        cur_code=key_scan=k;
        KEY[k]=1;
        key_press=1;
        if(specialflag)c=specialnames[k];
        else
        {
                c=asciinames[k];
                if((c>='a')&&(c<='z')&&caps)
                c-='a'-'A';
        }
        if(c)key_ascii=c;
    }
    specialflag=0;
}
outp(0x20,0x20);

_enable();
}

/*-------------------------------------------------------------------------------*/
//卸载键盘函数,正常情况用户不必亲自调用
void unkey_init()
{clear_keybuf();
    _dos_setvect(9,_old_key_interrupt);
}

//键盘初始化,要使用键盘函数必需调用
void key_init()
{    clear_keybuf();
    setkeyspeed();
    _old_key_interrupt=_dos_getvect(9);
    _dos_setvect(9,key_interrupt);
    atexit(unkey_init);
}

//有键按下时返回为真
char keypressed()
{
if(key_press)return 1;
else return 0;
}

//读按键,与Allegro不同,它返回你刚按下的键位码
short readkey()
{return key_ascii;}

//向键盘缓冲区写入,只能在KEY[...]
void simulate_pressed(char keyy)
{KEY[keyy]=1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -