0 / 0 / 0
Регистрация: 30.03.2018
Сообщений: 2
1

Port[$60] Не работают управляющие клавиши Ctrl, Alt и т.д

09.04.2018, 15:19. Показов 2708. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток!
проблема следующая: есть обработчик прерываний клавиатуры, в котором к клавишам привязаны какие то действия. Возникла проблема с управляющими клавишами. Нужно сделать комбинацию Ctrl + 5, но Ctrl никак не хочет работать. Помогите пожалуйста.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
var 
kbFlags: Word absolute $40:$17;
 
....
 
procedure KHandler; Interrupt;
var
  s: String;
 
  {kbFlags: Word absolute $40:$17;}
begin
{c:= Port[$60];}
  case Port[$60] of
    1:  Kill := True;                         { нажата Esc }
    2:  if Time[1]   > 0  then Dec(Time[1]);  { нажата 1 }
    3:  if Time[1]   < 70 then Inc(Time[1]);  {        2 }
    4:  if Time[2]   > 0  then Dec(Time[2]);  {        3 }
    5:  if Time[2]   < 70 then Inc(Time[2]);  {        4 }
    6:  if Time[3]   > 0  then Dec(Time[3]);  {        5 }
    7:  if Time[3]   < 70 then Inc(Time[3]);  {        6 }
    8:  if Time[4]   > 0  then Dec(Time[4]);  {        7 }
    9:  if Time[4]   < 70 then Inc(Time[4]);  {        8 }
    10: if speed     > 1  then Dec(speed);    {        9 }
    11: if speed     < 25 then Inc(speed);    {        0 }
    18: if mus_Speed > 1  then Dec(mus_Speed);{        E }
    19: if mus_Speed < 25 then Inc(mus_Speed);{        R }
 
 
 
    23: Change_Status(1); { нажата I }
    24: Change_Status(2); {        O }
    25: Change_Status(3); {        P }
    36: Change_Status(4); {        J }
    37: Change_Status(5); {        K }
    38: Change_Status(6); {        L }
    96: if kbFlags and 6<>0 then begin  {здесь должна быть комбинация Ctrl+5, но она не работает}
    if y=25 then begin
    y:=1;
Print(Pustr, 40 - Length(Pustr) div 2, 25, 1);
if Thread[1] = Active then begin
    Inc(impuls_Counter);
    if impuls_Counter mod speed = 0 then begin
    Print(Title, 40 - Length(Title) div 2, y, 1 + Random(15));
    impuls_Counter := 0;
    end;
    end;
    end
    else begin
    y:=25;
Print(Pustr, 40 - Length(Pustr) div 2, 1, 1);
if Thread[1] = Active then begin
    Inc(impuls_Counter);
    if impuls_Counter mod speed = 0 then begin
      Print(Title, 40 - Length(Title) div 2, y, 1 + Random(15));
      impuls_Counter := 0;
    end;
    end;
Inc(T);
Inline($9C);
end;
end;
end;
  Str(Time[1], s); Print(s + ' ', 25, 14, White);
  Str(Time[2], s); Print(s + ' ', 25, 15, White);
  Str(Time[3], s); Print(s + ' ', 67, 14, White);
  Str(Time[4], s); Print(s + ' ', 67, 15, White);
 
  Str(speed, s);
  Print(s + ' ', 17, 22, White);
  Str(mus_Speed, s);
  Print(s + ' ', 59, 22, White);
 
  while KeyPressed do
    ReadKey;
 
  Inline($9C);
  OldKHandler;
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2018, 15:19
Ответы с готовыми решениями:

Не работают клавиши alt,ctrl
После включения компьютера перестали работать клавиши alt,ctrl. Подскажите в чем может быть...

Как программно включать и отключать клавиши (ALT, Shift, Win, Ctrl, F4)
Как программно включать и отключать клавиши(ALT, Shift, Win, Ctrl, F4) Добавлено через 3 минуты...

Окно безопасного входа в систему Windows XP (требующего нажать Ctrl-Alt-Del) зависает при нажатии Ctrl-Alt-Del
Здравствуйте. Недавно столкнулся с проблемой. Есть компьютер, подключенный к домену, в групповой...

После перезагрузки/выключения компьтера работают только ctrl,alt,del,numLock
Вобщем проблема следующая при первом включении компа (воткнул в розетку и включил) клавиатура...

6
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
09.04.2018, 21:24 2
96 -- это "8" на нампаде, нет?
Ctrl -- это kbFlags and 4 <> 0, нет, (но это в данном случае не влияет)
0
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
10.04.2018, 11:16 3
Цитата Сообщение от Ktoto93 Посмотреть сообщение
Нужно сделать комбинацию Ctrl + 5, но Ctrl никак не хочет работать
Просто Вы его не хотите обрабатывать. Обработчик клавиатуры вызывается всегда когда клавиша нажата или отпущена:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
uses WinDos;
var
  keyCtrl,keyEsc,key5:boolean;
  old09:procedure;
procedure new09;interrupt;
  var
    a:byte;
  begin
    a:=port[$60];
    a:=a and $7F;
    case a of
      1 :keyEsc:=not keyEsc;
      6 :key5:=not key5;
      29:keyCtrl:=not keyCtrl;
      end;
    old09;
  end;
begin
  keyCtrl:=false;
  key5:=false;
  keyEsc:=false;
  GetIntVec(09,@old09);
  SetintVec(09,@new09);
  repeat
    if keyCtrl and key5 then writeln('press Ctrl+5');
  until KeyEsc or(keyCtrl and key5);
  SetIntVec(09,@old09);
  readln;
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
10.04.2018, 18:24 4
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Просто Вы его не хотите обрабатывать
Его не обязательно обрабатывать самому. Вызывается умолчальный обработчик, он выставляет флаги в $40:$17 и $40:$18, этого вполне достаточно.

Кстати, про вызов подмененного обработчика -- пропущен PUSHF:
Pascal
16
  Inline($9C); Old09;
Добавлено через 2 минуты
А сброс старшего бита сыграет плохую службу при автогенерации по удержанию клавиши (отпускания при этом не генерируются), а у вас будет меняться состояние нажатия "Ctrl"...
0
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
10.04.2018, 19:19 5
Цитата Сообщение от bormant Посмотреть сообщение
PUSHF
О нем забыл, каюсь, давно обработчики на паскале не писал, все ассемблером дырки затыкал.

Цитата Сообщение от bormant Посмотреть сообщение
А сброс старшего бита сыграет плохую службу при автогенерации
Я показывал пример как это можно сделать, об автогенерации даже и не думал.
Если сравнивать CASE из варианта ТС и мой, я просто нервно курю в сторонке.


Добавлено через 27 минут
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
uses WinDos,crt;
const
  keyEsc=1;
  key5=6;
  keyCtrl=29;
var
  i:byte;
  key:array[1..127]of boolean;
  old09:procedure;
procedure new09;interrupt;
  var
    a:byte;
  begin
    a:=port[$60];
    key[a and $7F]:=(a and $80)=0;
    inline($9C);
    old09;
  end;
begin
  for i:=1 to 127 do key[i]:=false;
  GetIntVec(09,@old09);
  SetintVec(09,@new09);
  repeat
    while KeyPressed do ReadKey;
    if key[keyCtrl] and key[key5] then writeln('press Ctrl+5');
  until key[KeyEsc]or(key[keyCtrl] and key[key5]);
  SetIntVec(09,@old09);
  readln;
end.
Переделал по образу моего обработчика на асме.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
10.04.2018, 20:18 6
Constantin Cat,
совсем другое дело Но вариант с "kbPad5: if kbFlags and kfCtrl<>0 then" тоже вполне имеет право на жизнь...
А обработчик у ТС монструозен, тут уж никаких возражений...
0
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
10.04.2018, 23:09 7
Цитата Сообщение от bormant Посмотреть сообщение
совсем другое дело
Я когда игрушки писал, таким обработчиком(на асме) обрабатывал все клавиши, и это мне позволяло настраивать любые комбинации самому пользователю.

Цитата Сообщение от bormant Посмотреть сообщение
обработчик у ТС монструозен
И это ещё основной код нам не показали.

ТС наверное не знает, что любой обработчик прерываний должен быть маленьким.
0
10.04.2018, 23:09
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2018, 23:09
Помогаю со студенческими работами здесь

Отключить функциональность клавиш Alt+Tab, Alt+F4, Ctrl+Alt+Del
Всем привет! Как мне в программе написаной в PureBasic отключить функциональность клавишь Alt+Tab,...

Не работают горячие клавиши Ctrl+? в Firefox, Ubuntu 17.04
В общем есть такая проблема: В firefox не работают некоторые горячие клавиши, к примеру Ctrl+C,...

Не работают обе клавиши alt на ноутбуке Asus Vivobook
Довольно странно, они то обе работают, то обе нет. С чем может быть связано, какие способы решения...

Исходники для блокирования клавишь alt + F4,ctrl + alt+ del
У кого нить есть исходники для блокирования клавишь alt + F4,ctrl + alt+ del ? И для защиты...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как обучить нейросеть создания картинок на Python
bytestream 24.01.2025
В эпоху цифровых технологий искусственный интеллект становится неотъемлемой частью творческого процесса. Особое место в этой области занимает разработка и обучение нейронных сетей для создания. . .
Как обучить нейросеть генерации текста на Python
bytestream 24.01.2025
В современном мире искусственный интеллект и машинное обучение становятся неотъемлемой частью многих технологических решений. Одной из наиболее интересных и востребованных задач в этой области. . .
Машинное обучение на Python
bytestream 24.01.2025
Введение в машинное обучение на Python Машинное обучение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, которая позволяет компьютерным системам. . .
Как удалить вирус-майнер с компьютера
hw_wired 24.01.2025
Вирусы-майнеры стали одной из наиболее серьезных угроз для пользователей компьютеров. Эти вредоносные программы тайно используют вычислительные ресурсы зараженного устройства для добычи криптовалюты. . .
Что такое веб-сервер, для чего он нужен и как работает
bytestream 24.01.2025
В современную эпоху цифровых технологий веб-сервер является фундаментальным компонентом интернет-инфраструктуры, обеспечивающим функционирование множества онлайн-сервисов и веб-сайтов. Этот. . .
Как в цикле for перебрать все элементы в словаре в Python
bytestream 24.01.2025
Словари в Python представляют собой мощные структуры данных, которые позволяют хранить информацию в формате ключ-значение. Эта особенность делает их незаменимыми при работе с данными, где требуется. . .
Как отменить rebase в Git
hw_wired 24.01.2025
Git rebase представляет собой мощный инструмент для управления историей коммитов в системе контроля версий Git. Этот механизм позволяет разработчикам изменять последовательность, комбинировать или. . .
Как поменять цвет input placeholder с помощью CSS
bytestream 24.01.2025
В веб-разработке оформление элементов пользовательского интерфейса играет ключевую роль в создании привлекательного и интуитивно понятного дизайна. Особое внимание уделяется формам ввода данных, где. . .
Как перебрать все значения в перечислении (enum) в C#
bytestream 24.01.2025
Перечисление (enum) в языке программирования C# представляет собой специальный тип данных, который позволяет определить набор именованных констант. Этот мощный инструмент особенно полезен, когда. . .
Как обойтись без проверки на null, чтобы избежать NullPointerExce­ption в Java
bytestream 24.01.2025
NullPointerException (NPE) является одним из самых распространенных исключений в Java, создающих серьезные проблемы при разработке программного обеспечения. Данное исключение возникает при попытке. . .
Что лучше использовать в href ссылок в JavaScript: "#" или "javascript:voi­­d(0)­"
bytestream 24.01.2025
При разработке веб-приложений важную роль играет правильное использование HTML-ссылок в сочетании с JavaScript. Одним из ключевых аспектов является выбор корректного значения атрибута href для. . .
Как узнать индекс элемента списка по его значению в Python
hw_wired 24.01.2025
При работе с коллекциями данных в Python часто возникает необходимость не только манипулировать элементами списка, но и определять их точное местоположение. Индекс элемента представляет собой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru