Форум программистов, компьютерный форум CyberForum.ru

Работа с клавиатурой, сочетания клавиш, блокировка клавиш - C++

Восстановить пароль Регистрация
 
philimoner
0 / 0 / 0
Регистрация: 03.03.2015
Сообщений: 4
04.07.2015, 10:07     Работа с клавиатурой, сочетания клавиш, блокировка клавиш #1
Здравствуйте!

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


Можете подсказать направление, в котором копать? Как задать комбинацию клавиш? Как блокировать ввод определённых клавиш? Звуковой сигнал тоже немного напрягает, ибо "\a" работает не на всех мамках, а других вариантов я не знаю.

Дайте мне хотя бы пинка в правильном направлении, а там уже сам попробую чего-нибудь придумать)))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2015, 10:07     Работа с клавиатурой, сочетания клавиш, блокировка клавиш
Посмотрите здесь:

C++ нажатие клавиш
Нажатие клавиш C++
C++ Нажатия клавиш
C++ Обработка клавиш!
Состояния клавиш C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Рыжий Лис
Просто Лис
 Аватар для Рыжий Лис
209 / 164 / 44
Регистрация: 17.05.2012
Сообщений: 611
Записей в блоге: 4
04.07.2015, 10:18     Работа с клавиатурой, сочетания клавиш, блокировка клавиш #2
Могу предложить код на tasm.
Кликните здесь для просмотра всего текста
Assembler
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
;Написать обработчик прерываний от клавиатуры. Изучить и реализовать, если необходимо, отслеживание временных промежутков с помощью прерывания 1Ch. Изучить перепрограммирование стандартного контроллера прерываний, реализацию маскирования линий IRQ. Самостоятельно решить задачу в соответствии с индивидуальным вариантом.
 
;64. Цифры можно набирать (от 1 до 9) только через нажатие ScrollLock, количество нажатий больше цифры на 1. Например, 3 – это 4 нажатия ScrollLock, при этом интервал между нажатиями должен быть не более 1 секунды.
  
;TASM, COM-файл
.286                      ; for pusha popa
.model tiny               ; Модель памяти, используемая для COM
.code                     ; Начало сегмента кода
org 100h                  ; for *.COM
start:
    jmp main
;///////////////////////////////////////////////////////////////////////
; обработчик 1Ch (вызывается таймером)
my proc far
    pusha
    sti     ;Установка флага прерывания
    
    cmp cs:flag,0   
    jz zero                 ; if(flag==0)
    
    dec cs:flag                ; flag--
    jmp exit
zero:
    cmp cs:kol,0   
    jz exit
    ;выводим цифру
    
    mov cs:kol,0
    
exit:
    cli           ;Сброс флага прерывания.
    mov al,20h    ;пошлем контроллеру прерываний???
    out 20h,al    ;сигнал EOI???
    popa
    iret                    ; завершаем прерывание
my endp
;///////////////////////////////////////////////////////////////////////
; обработчик 09h (вызывается клавиатурой)
my2 proc far
    pusha
   ; sti     ;Установка флага прерывания
    
    in al,60h               ; принимаем скан-код с клавиатуры
    cmp al,46h              ; сравниваем со скан кодом Scroll lock
    jnz notscr
    
    mov cs:flag,20
    inc cs:kol                 ;kol++    
   
    jmp ok
notscr:
    ;блокируем цифры 1-9
    ;TODO сравнить if (al>02h $$ al<0ah)
    cmp al,02h              ; сравниваем с '1'
    jz ok
    cmp al,03h            
    jz ok
    cmp al,04h            
    jz ok
    cmp al,05h            
    jz ok
    cmp al,06h            
    jz ok
    cmp al,07h            
    jz ok
    cmp al,08h            
    jz ok
    cmp al,09h            
    jz ok
    cmp al,0Ah            
    jz ok
old:
    popa
    jmp dword ptr [oldint9] ; передаем управление старому обработчику
;///
ok:
    in al,61h    ;посылаем подтверждение о считывании scan-кода???
    or al,80h    ;из порта 60h
    out 61h,al    ;в порт 61h
   ; cli           ;Сброс флага прерывания.
    mov al,20h    ;пошлем контроллеру прерываний???
    out 20h,al    ;сигнал EOI???
    popa
    iret
my2 endp
;///////////////////////////////////////////////////////////////////////
main:
    ; устанавливаем свой обработчик таймера
    mov ax,251Ch
    mov dx,offset my
    int 21h       
    
    ;~ mov ax,3509h            ; принимаем адрес обработчика int 9
    ;~ int 21h
    ;~ mov word ptr oldint9+2,es ; сохраняем аддрес
    ;~ mov word ptr oldint9,bx
    
    ; устанавливаем свой обработчик клавиатуры
    mov ax,2509h
    mov dx,offset my2
    int 21h     
    
    jmp $
   ; int 20h ;выход
    ;////////////////////////////////////////////////////////////////////    
    oldint9 dd ?  ; здесь будет храниться адрес старого обработчика
    flag    db 20 ;1 dup (?)   ;счётчик таймера
    kol     db 0 
    ;~ hello   db 'hello from 1Ch',0Dh,0Ah,'$'  
    ;~ hello2  db 'hello from 09h',0Dh,0Ah,'$'  
    ;~ mes     db 'Ok',0Dh,0Ah,'$'
    ;~ buffer  db 255 dup ('$')
    ;~ endl    db 0Dh,0Ah,'$'
end start
Компилируется так:
Bash
1
2
3
tasm %1.asm
tlink %1.obj /t
%1.com


Добавлено через 1 минуту
И да, код работает только по dos.
Стасюльчик
1 / 1 / 1
Регистрация: 05.06.2015
Сообщений: 23
04.07.2015, 12:07     Работа с клавиатурой, сочетания клавиш, блокировка клавиш #3
Для нажатия клавиш можно подключить библиотеку "windows.h"
и в бесконечный цикл while(true) впихнуть функцию GetAsyncKeyState пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <Windows.h>
#include <iosream>
 
void main()
{
while(true)
{
if(GetAsyncKeyState(VK_RIGHT) // Если нажата правая стрелка
{
std::cout << "you pressed right arrow";
}
}
}
И вообще почитай про функцию GetAsyncKeyState
P.S Код писал на телефоне, так что извини если есть какие-либо ошибки
Krasiosoft
 Аватар для Krasiosoft
51 / 51 / 15
Регистрация: 01.06.2015
Сообщений: 189
04.07.2015, 18:26     Работа с клавиатурой, сочетания клавиш, блокировка клавиш #4
Если нужно запрещать нажатия определенных клавиш и речь идет о windows'e, то есть функция SetWindowsHookEx, использовать нужно с WH_KEYBOARD_LL.
Yandex
Объявления
04.07.2015, 18:26     Работа с клавиатурой, сочетания клавиш, блокировка клавиш
Ответ Создать тему
Опции темы

Текущее время: 14:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru