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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
philimoner
0 / 0 / 0
Регистрация: 03.03.2015
Сообщений: 4
#1

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

04.07.2015, 10:07. Просмотров 977. Ответов 3
Метки нет (Все метки)

Здравствуйте!

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


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

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

Вывод сообщения о нажатии сочетания клавиш - C++
Что неправильно? LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM IParam) case WM_KEYDOWN: { int nVirtKey =...

Реализовать выход из многопоточного приложения при нажатии сочетания клавиш "Ctrl+С" - C++
Добрый день! Подскажите пжл, как реализоввать выход с многопоточного(консольного) приложения по обработке нажатия клавишь ctrl+c(при этом...

Нажатие клавиш - C++
Ребята, перерыл интернет, но так и не понял, как сделать обработку нажатия клавиш с буквами алфавита к примеру этот код у меня работает: ...

Нажатия клавиш - C++
В mfc нужно чтобы при нажатии клавиш, происходило действие. С помощью WM_KEYDOWN, пытался сделать, чтобы при нажатии клавиш программа...

Обработка клавиш! - C++
кароче не могу написать программу в консоле каторая, если нажата клавиша space то выводится сообщение что клавиша нажата!, а если опущена...

Номера клавиш - C++
Драсти, у меня возможно странный вопрос) : есть команда waitkey(10) - 10 это какая клавиша? а то в разных источниках по разному указано....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Рыжий Лис
Просто Лис
308 / 255 / 71
Регистрация: 17.05.2012
Сообщений: 1,053
Записей в блоге: 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.
0
Стасюльчик
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 Код писал на телефоне, так что извини если есть какие-либо ошибки
0
Krasiosoft
51 / 51 / 15
Регистрация: 01.06.2015
Сообщений: 189
04.07.2015, 18:26 #4
Если нужно запрещать нажатия определенных клавиш и речь идет о windows'e, то есть функция SetWindowsHookEx, использовать нужно с WH_KEYBOARD_LL.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2015, 18:26
Привет! Вот еще темы с ответами:

Нажатие клавиш - C++
У меня есть консольное приложение, как сделать чтобы при нажатии на определенную клавишу происходили определенные действия) Например при...

Считывание клавиш - C++
Функция из &lt;conio.h&gt; _getch(); обрабатывает кнопки , но только тогда , когда окно(консольное) активно. Как сделать считывание клавиш в...

Сочетание клавиш - C++
Хочу заставить программу нажимать сочетание клавиш Clrl + Shift + L, не могу ни в какую Пробовал на C#, тоже не то Помогите пожалуйста

Case клавиш - C++
Подскажите пожалуйста, как мне узнать какие case у клавиш: w, a, s, d и пробела. Заранее спасибо.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.07.2015, 18:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru