📄 doskeys.c
字号:
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#define ESC 1
#define UP 72
#define _UP 200
#define DOWN 80
#define _DOWN 208
#define LEFT 75
#define _LEFT 203
#define RIGHT 77
#define _RIGHT 205
#define NUM_KEYS 4
#define INDEX_UP 0
#define INDEX_DOWN 1
#define INDEX_LEFT 2
#define INDEX_RIGHT 3
char *key_table_name[NUM_KEYS] = {"UP","DOWN","LEFT","RIGHT" };
int key_scan_code; /* 键盘扫描码 */
int key_table[NUM_KEYS]; /* 按键表 */
/* 自定义中断处理函数 */
void far interrupt newhandler()
{
int status;
key_scan_code = inp(0x60); /* 读键盘扫描码 */
status = inp(0x61); /* 读键盘状态 */
outp(0x61,status & 0x80); /* 置位7并写 */
outp(0x61,status); /* 再写位7 */
outp(0x20,0x20); /* 复位PIC */
/* 记录光标键,设置key_table[]中的状态1为按下键,0为松开键 */
switch(key_scan_code)
{
case UP: key_table[INDEX_UP] = 1; break;
case _UP: key_table[INDEX_UP] = 0; break;
case DOWN: key_table[INDEX_DOWN] = 1; break;
case _DOWN: key_table[INDEX_DOWN] = 0; break;
case LEFT: key_table[INDEX_LEFT] = 1; break;
case _LEFT: key_table[INDEX_LEFT] = 0; break;
case RIGHT: key_table[INDEX_RIGHT] = 1; break;
case _RIGHT:key_table[INDEX_RIGHT] = 0; break;
}
}
/* 初始化键盘表 */
void init_key_table(void)
{
register i;
for(i=0;i<NUM_KEYS;i++)
key_table[i]=0;
}
void main(void)
{
int i;
void interrupt (* oldhandler)(void); /* 定义一个中断类型的指针,用于保存旧的中断向量*/
clrscr();
/* 开始自定义中断处理 */
oldhandler = getvect(9);
setvect(9, newhandler);
printf("Play with the arrow keys, press ESC to quit.\n");
while(key_scan_code != ESC)
{
init_key_table();
gotoxy(5,5);
printf("Key scancode: %d", key_scan_code);
gotoxy(5,10);
printf("Key name:");
for(i=0;i<NUM_KEYS;i++)
{
if(key_table[i] != 0)
printf("%s",key_table_name[i]);
}
}
setvect(9, oldhandler);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -