Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Блокирование нажатия клавиши (Assembler)  (Прочитано 10410 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
demonhunterus
Интересующийся

ua
Offline Offline

« : 08-10-2011 06:32 » 

Добрый день.Пытаюсь разобраться с блокированием нажатия определенных клавиш на клавиатуре.К примеру,пытаюсь заблокировать нажатие клавиши g.
Поискал в интернете+сам кое-что додумал и получил следующий код
Код:
#include <dos.h>
#include <stdio.h>
#include <conio.h>

void _interrupt _far On_Or_Off(void);
void (_interrupt _far *oldvect)(void);
char Mode = 0, Exit=0;
char string[10];
void _interrupt _far On_Or_Off(void)
{
  unsigned char value,Shift=0x02,Alt=0x08,c;
  value=peekb(0x40,0x17);

  if( (inportb(0x60)== 0x41 )&& (value&Shift)&& (value&Alt) )
  {
   if(Mode==0)
   {
    Mode=1;
    cprintf("The g button is LOCKED\n\r");
   }
   else
   {
    Mode=0;
    cprintf("The g button is UNLOCKED\n\r");
   }
  }

  if( (Mode==1) && (inportb(0x60)== 0x22 ) )
   {
    c=inportb(0x61);
    outportb(0x61,c|0x80);
    outportb(0x61,c);
    outportb(0x20,0x20);

   }

  if( (inportb(0x60)== 0x1 ) )
    Exit=1;

  _chain_intr(oldvect);
}

int main ()
{
clrscr();
oldvect = _dos_getvect(0x9);
_dos_setvect(0x9, On_Or_Off);
printf("Press Alt+Shift+F7 to block/unlock g button on keyboard\n");
   printf("Enter A Char String\n");
   scanf("%s",string);
for(;!Exit;)
    sleep(1);
_dos_setvect(0x9,oldvect);
getch();
return 0;
}


Включение нового обработчика после нажатия Alt+Shift+F7 происходит успешно,однако сама клавиша не блокируется при нажатии и преспокойно отображается на экране.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 08-10-2011 07:04 » 

видимо не снимается признак готовности клавы
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #2 : 08-10-2011 07:28 » new

Признак готовности клавиатуры?Это в новом обработчике?А то я не совсем понял.
Я думал проблема в этой части
Код:
if( (Mode==1) && (inportb(0x60)== 0x22 ) )
   {
    c=inportb(0x61);
    outportb(0x61,c|0x80);
    outportb(0x61,c);
    outportb(0x20,0x20);

   }

,но покопавшись ещё раз в примере,откуда взят этот кусок,увидел,что всё совпадает.

Добавлено через 35 минут и 31 секунду:
Код:
#include <dos.h>
#include <stdio.h>
#include <conio.h>

void interrupt (*old9)();
void interrupt new9();
char f=0;

void main()
{
  char string[80];
  clrscr();
  old9=_dos_getvect(0x9);
  _dos_setvect(0x9, new9);
  cprintf("\rPress Alt+Shift+F7 To Block or Unlock The g Button\n\r");
  cprintf("\rEnter A Char String>");
  scanf("%s",string);
  _dos_setvect(0x9,old9);
}


void interrupt new9()
{
  unsigned char c,value,Shift=0x02,Alt=0x08;
  value=peekb(0x40,0x17);
  if((inportb(0x60)==0x41)&&(value&Shift)&&(value&Alt))
  {

   if(f==0)
   {
    f=1;
    cprintf("\n\rThe g key is locked\n\r");
   }
   else
   {
    f=0;
    cprintf("\n\rThe g key is unlocked\n\r");
   }
   (*old9)();
  }
  if( (f==1) && (inportb(0x60)==0x22) )
  {
   c=inportb(0x61);
   outportb(0x61,c|0x80);
   outportb(0x61,c);
   outportb(0x20,0x20);
  }
  else
   (*old9)();
}

Вот так заработало.
Я так понял дело было в  (*old9)(); только вот я не пойму зачем каждый раз вызывать старый обработчик?
« Последнее редактирование: 08-10-2011 08:04 от demonhunterus » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 08-10-2011 08:18 » 

demonhunterus, значит, что ты не все правильно обработал в своем прерывании

зы где ты увидел, что ты каждый раз вызываешь?

ззы Вызывать старый нужно каждый раз. И нужно для того, чтобы твои нажатые кнопки подверглись обработке другими программами. Ты ведь не один в системе, хотя это и ДОС.


« Последнее редактирование: 08-10-2011 08:23 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #4 : 08-10-2011 08:25 » 

Код:
 {
    f=0;
    cprintf("\n\rThe g key is unlocked\n\r");
   }
   (*old9)();
  --- ну тут понятно.Если мы разблокировали клавишу,то должны вернуть старый обработчик.

Код:
if( (f==1) && (inportb(0x60)==0x22) )
  {
   c=inportb(0x61);
   outportb(0x61,c|0x80);
   outportb(0x61,c);
   outportb(0x20,0x20);
  }
  else
   (*old9)();
а вот тут я не понял зачем. Или (*old9)() не вызывает старый обработчик?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 08-10-2011 08:35 » 

Код:
if( (f==1) && (inportb(0x60)==0x22) )
  {
   c=inportb(0x61);
   outportb(0x61,c|0x80);
   outportb(0x61,c);
   outportb(0x20,0x20);
  }
  else
   (*old9)();
а вот тут я не понял зачем. Или (*old9)() не вызывает старый обработчик?
Читаем Внимательно код!!!!
Если нужная кнопка, то прочитали порт и очистили
ИНАЧЕ вызвали старыій обработчик
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #6 : 08-10-2011 08:38 » 

Всёёёёёё.Разобрался.Благодарю!
« Последнее редактирование: 08-10-2011 08:53 от demonhunterus » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 08-10-2011 08:52 » 

Эммм.А зачем его вызывать в противном случае?Чтобы снять признак готовности клавиатуры,как Вы писали в самом начале?
Нет, чтоб отдать управление следующим программам (я об этом тоже писал) (например принтскрин)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines