Обработка прерывания от клавиатуры, распознавание нажатия "горячей" комбинации клавиш; при первом нажатии "горячей" комбинации переходить в режим блокировки ввода заданной клавиши, при втором - отменять этот режим; при этом системная обработка всех других клавиш нарушаться не должна.
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#ifdef__cplusplus
#define__CPPARGS...
#else
#define__CPPARGS
#endif
/*адрес старого обработчика прерывания 9h*/
void interrupt (*old9)(__CPPARGS);
/*адрес нового обработчика прерывания 9h*/
void interrupt new9(__CPPARGS);
unsigned char F3_code=61; /* скан-код "F3" */
unsigned char key3_code=4;/* скан-код "3" */
char f=0; /* флаг блокирования:
1-клавиша заблокирована*/
/*--------------------------------------------------------*/
void main()
{
char string[80]; /*символьный массив*/
clrscr();
/* запоминаем адрес старого обработчика прерывания 9h*/
old9=getvect(9);
/* записываем в таблицу векторов прерываний адрес нового обработчика прерывания*/
setvect(9, new9);
printf("\n\n\r\"hot\" combination: ");
printf("Left Shift, Right Ctrl, F3\n\r");
printf("Key blocking: ");
printf("3");
printf("\r\nInput symbols>");
scanf("%s",string);
setvect(9,old9);
}
/*--------------------------------------------------------*/
/*
процедура обработки прерывания от клавиатуры
*/
void interrupt new9(__CPPARGS)
{
unsigned char c,x,y;
unsigned char byte17,byte18;
unsigned char mask=0x02;
unsigned char mask17=0x04;
unsigned char mask18=0x01;
/*
выделяем биты 1и 2 в флаге по адресу 0040:0017
*/
byte17=peekb(0x40,0x17);
/*
выделяем бит 0 в флаге состояния клавиатуры по адресу 0040:0018
*/
byte18=peekb(0x40,0x18);
/*
если нажата F3 и левый Shift и правый Ctrl
*/
if((inportb(0x60)==F3_code)&&(byte17&mask)&&
(byte17&mask17)&&(!(byte18&mask18)))
{
cputs("\7");
x=wherex();
y=wherey();
gotoxy(55,3);
if(f==0)
{
f=1;
printf("Key \"3\" blocking ");
}
else
{
f=0;
printf("Key \"3\" unblocking");
}
gotoxy(x,y);
/*восстанавливаем старый обработчик прерываний*/
(*old9)();
}
/*если режим блокирования и нажата клавиша 3*/
if( (f==1) && (inportb(0x60)==key3_code) )
{
c=inportb(0x61);
outportb(0x61,c|0x80);
outportb(0x61,c);
/*сброс контроллера прерываний*/
outportb(0x20,0x20);
}
else
/*восстанавливаем старый обработчик прерываний*/
(*old9)();
}
|