Статистика
Главная » Статьи » Лабораторные работы » C/C++

Обработка прерывания от клавиатуры, распознавание нажатия "горячей" комбинации клавиш;

Обработка прерывания от клавиатуры, распознавание нажатия "горячей" комбинации клавиш; при первом нажатии "горячей" комбинации переходить в режим блокировки ввода заданной клавиши, при втором - отменять этот режим; при  этом системная обработка всех других клавиш нарушаться не должна.

#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)();

}

Категория: C/C++ | Добавил: admin (27.01.2015)
Просмотров: 2589 | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт