📄 keyboard.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,®s,®s);
}
/*-------------------------------------------------------------------------------*/
//清除键盘缓冲区
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 + -