Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 20.09.2010
Сообщений: 36

Блокирование нажатия клавиши

08.10.2011, 10:38. Показов 2071. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.Пытаюсь разобраться с блокированием нажатия определенных клавиш на клавиатуре.К примеру,пытаюсь заблокировать нажатие клавиши g.
Поискал в интернете+сам кое-что додумал и получил следующий код
C
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
#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 происходит успешно,однако сама клавиша не блокируется при нажатии и преспокойно отображается на экране.
Подскажите,где искать проблему?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2011, 10:38
Ответы с готовыми решениями:

Ожидание нажатия клавиши
У меня ниже представлен код. Как сделать что б на указанном участке прорамма приостановилась и ждала нажатия клавиши для дальнейшего...

Побуквенный вывод слова через цикл + ожидания нажатия клавиши (после нажатия очистка и установка курсора на )
строку) Masm32 (com -программа) вообщем столкнулся с проблемой. к примеру ввожу ' LSD49 $' выводится через цикл loop (в ECX -...

Проверка нажатия клавиши
Процедура проверки нажатия клавиши. Как сделать так, чтобы вместо проверки на нажатие CTRL+C была проверка на нажатие LEFT SHIFT ? key...

2
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
08.10.2011, 12:14
Цитата Сообщение от Demonhunterus
Подскажите,где искать проблему?
В соседнем топике.
Вот руссификатор клавиатуры, лишнее отрежешь:
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
.286c
PAGE  59,132
 
Kb_flags_1_     Equ 417h        ;
Kb_flags_3_     Equ 496h        ;
Vector_15h_off      Equ 54h     ;
Vector_15h_seg      Equ 56h             ;
Keybd_flags_1_      Equ 17h             ;
Keybd_flags_2_      Equ 18h             ;
Keybd_q_head_       Equ 1Ah             ;
Keybd_q_tail_       Equ 1Ch             ;
CapsLk          Equ 40h             ;
BothShift       Equ 3               ;
AltCtrl         Equ 0Ch             ;
Timer_command       Equ 00B6H       ; value for timer setup
Timer_command_register  Equ 0043H       ; port address
Timer_latch_register    Equ 0042H       ; port address
Port_pb         Equ 0061H       ; port address
Speaker_on      Equ 00000011B   ; bit mask
Clock_rate_high     Equ 0012H       ; 1.19318 MHz as 32 bit value
Clock_rate_low      Equ 34DCH           ;
Timer_low       Equ 6ch             ;
Tabl            Equ 5ch             ;
Tone_r          Equ 83h             ;
Rld_call        Equ 0ach            ;
Cyrillic        Equ 0B0h        ;
 
$VER$           equ 0101h
 
seg_a       segment byte public
        assume  cs:seg_a, ds:seg_a
 
        org 100h
 
 
start:
        jmp init
copyrt      db  'KB: by Kludge (c) 1994',0Dh,0Ah,'$'
 
 
old_isr15   dd  ?           ; previous INT 15h handler
;
 
;
;           INT 15h Entry Point
;
;
Int_15h_entry   proc    far
        pushf
        cmp ah,4Fh          ; Keyboard intercept ?
        jz  $$1         ; yes, processing
        popf
        jmp dword ptr cs:Old_isr15  ; go back
 
;
; Mode Toggle Section
;
 
$$1:
        cmp al,0ffh
        jnz $$001
        mov ax,$VER$
        popf
        clc
        retf    2
$$001:
        call    dword ptr cs:Old_isr15
        pusha
        push    ds          ;
        push    es          ;
 
        push    cs          ;
        pop ds          ;   ds = cs
        push    ax
        xor ax,ax           ;; set up BIOS data seg
        mov es,ax           ;;
        mov dx,word ptr es:Kb_flags_1_
        mov ax,dx
        mov bl,byte ptr es:Kb_flags_3_
        and bl,0ch
        AND ah,0f3h
        or  ah,bl
        and ax,0            ; This mask will be defined during startup
K_mask      equ $ - 2
 
        cmp ax,word ptr K_mask
        jnz $$3
$$03:       xor byte ptr ds:Cyrillic,0ffh ; Yes,toggle mode
        mov bx,300h
        jnz $$2         ;
        or  bx,550h         ; for Russ/Lat
$$2:        mov ax,Tone_r       ; beep
        call    ax
;$$2:       call    ds:Tone_r       ;; ??? KL - 02-27-93 02:55pm
$$3:
        pop ax
;
; Encoding Section
;
 
        push    ds
        pop es
        cmp byte ptr ds:Cyrillic,0  ; Cyrillic mode ?
        jz  $$9         ; No , nothing to do
        test    dl,08h
        jz     $$3b
        mov di, offset tabl3
        mov cx,6
        cld
        repne   scasb
        jnz $$3b
        add di,5
        test    dl,BothShift
        jz  $$3c
        add di,6
$$3c:       xchg    ah,al
        mov al, byte ptr es:[di]
        jmp $$8
$$3b:       test    dl,AltCtrl      ; Alt or Ctrl Active ?
        jnz $$9         ; Yes, nothing to do
        cmp al,36h          ; Keypad ?
        jae $$9         ; Yes, nothing to do
        cmp al,0Fh          ; Special processing for scans 1 - 15 ?
        ja  $$30            ; No,branch
        test    dl,BothShift
        jz  $$9
        test    dl,2            ; Pressing <RightShift> in cyrillic
                        ; mode with keys in the upper column
                        ; of main keyboard must be have NO
                        ; translation effect
        jnz $$9         ; Nothing to do if so
$$30:       lea bx,ds:Tabl      ; Load encoding table addr to ds:bx
        mov cx,ax           ; save orginal scancode
        mov ah,al           ;
        xlat                ; al=[al+[bx]] table
        or  al,al
        jnz $$4         ; Yes, bye
        xchg    ax,cx
        jmp $$9
;
$$4:        cmp ah,0Fh          ; No , translation in progress
        jb  $$8
 
$$40:       test    dl,CapsLk       ; Caps Lock ?
        jz  $$5         ; no
        test    dl,BothShift        ;
        jz  $$8         ; UPPER CASE
        jmp short $$6       ;
$$5:                        ; Caps Lock set
        test    dl,BothShift        ; cleared
        jnz $$8         ; set
 
; drop to lower case
 
$$6:                        ;
        add al,20h          ; drop to lower
        cmp al,0B0h         ;
        jb  $$7
        add al,30h          ;
$$7:        cmp al,0E0h         ; it's russian lower 'r' ? (35/224)
        jnz $$8         ; Jump if not equal
        xor ah,ah           ; Clear scancode
 
$$8:
        xchg    cx,ax           ;
        mov ah,5            ;
        int 16h         ;
        stc
;
$$9:
        pop es          ; restore registers
        pop ds          ;
        popa
        jc  $$80
        iret                ; interrupt return / end of isr
$$80:       xor ax,ax
        retf    2
Int_15h_entry   endp
 
_end_:                      ; End of TSR section

;
; This section being relocated to PSP:[5c] during startup
;
Tabl_2:
        db  0,0,0,'@/":,._?%', 0,'!', 0,0
        db  'ЙЦУКЕНГШЩЗХЪ', 0, 0
        db  'ФЫВАПРОЛДЖЭ', 0, 0, 0
        db  'ЯЧСМИТЬБЮ', 0, 0
tabl3:      db  26,27,39,40,51,52
        db  '[];',27h,',.'
        db  '{}:"<>'
 
Tab_len     equ $ - Tabl_2
tone        proc    near
        push    cx
    ; 1.19318 MHz / frequency
 
    ; select timer channel 2; read/write LSB, MSB; mode 3; binary
        MOV AL, TIMER_COMMAND
        OUT TIMER_COMMAND_REGISTER, AL
 
        MOV DX, CLOCK_RATE_HIGH
        MOV AX, CLOCK_RATE_LOW
 
        DIV BX          ; AX = correct Hz divisor
 
    ; output LSB, MSB (this sets the frequency)
        OUT TIMER_LATCH_REGISTER, AL
        MOV AL, AH
        OUT TIMER_LATCH_REGISTER, AL
 
    ; save current setting of port pb
        IN  AL, PORT_PB
        PUSH    AX
 
    ; turn on speaker data and timer gate bits
        OR  AL, SPEAKER_ON
        OUT PORT_PB, AL
 
    ; speaker is on..wait the requested duration
        MOV cX, 0ffffh
xx:     loop    xx
        MOV cX, 0ffffh
xx1:        loop    xx1
    ; shut that thing off!!
        POP AX
        OUT PORT_PB, AL
        pop cx
 
TONE_RET:   retn
        dw  tone_r
        dw  0
tone        endp
rld_len     equ $ - tabl_2

;
; Startup code
;
init:
;       mov ah,0c0h         ;
;       int 15h                     ;
;       jc  old_bios                ;
;       cmp ah,86h                  ;
;       je  old_bios                ;
;       test    byte ptr es:[bx+5],16h  ;
;       jz  old_bios                ;
        cld             ; Clear direction
        xor ax,ax           ; Zero register
        mov es,ax                   ;
        mov ax,es:vector_15h_off    ; (0000:0024=507h)
        cmp ax,offset cs:int_15h_entry
        jnz loc_8           ; Jump if not equal
        cmp byte ptr cs:[80h],0     ;
        jnz q2                      ;
        JMP SHORT $21               ;
;old_bios:       mov    dx,offset bad_news      ;
;       jmp short $20               ;
$21:        mov dx,offset loaded        ;
$20:        mov ah,9                    ;
        int 21h         ; DOS Services  ah=function 09h
                        ;  display char string at ds:dx
quit:       mov ax,4C01h        ; DOS Services  ah=function 4Ch
        int 21h         ;  terminate with al=return code
q2:     jmp uninst                  ;
loc_8:                      ;
        mov word ptr cs:old_isr15,ax;
        mov ax,es:vector_15h_seg    ;
        mov word ptr cs:old_isr15+2,ax
        push    cs                      ;
        pop ds                      ;
        mov dx,offset int_15h_entry ;
        mov ax,2515h                ;
        int 21h                     ;
        mov dx,offset copyrt    ;
        mov ah,9                    ;
        int 21h         ; DOS Services  ah=function 09h
                        ;  display char string at ds:dx
        mov dx,offset sw_info   ;
        mov ah,9                    ;
        int 21h         ; DOS Services  ah=function 09h
                        ;  display char string at ds:dx
        push    es                      ;
        mov ax,cs:[2ch]             ;
        mov es,ax                   ;
        mov ah,49h                  ;
        int 21h                     ;
                        ;
        push    cs                      ;
        push    cs                      ;
        pop es                      ;
        pop ds                      ;
        mov cx,rld_len      ; fill unused DTA/Parm area
        mov si,offset tabl_2        ;
        mov di,tabl                 ;
        rep movsb                   ;
                        ;
        mov byte ptr cs:Cyrillic,0  ;
        mov cs:rld_call+2,cs        ;
;
        mov ax,0F3h                 ; set typematic : delay 250 ms, rept rate 30 cps
        call    out_ax          ;
        xor ax,ax           ; Zero register
        mov es,ax                   ;
        and byte ptr es:417h,8Fh    ; clear all flags except INS
                        ;
        mov ax,0EDh                 ; set LEDs : all LEDs off
        call    out_ax          ;
        mov cx,1                    ;
 
locloop_4:
        push    cx                      ;
        mov ax,07EDh                ; set LEDs : all LEDs on
        call    out_ax          ;
        mov ax,0EDh                 ; set LEDs : all LEDs off
        call    out_ax          ;
        pop cx                      ;
        loop    locloop_4       ; Loop if cx > 0
        pop es                      ;
 
        mov dx,offset cs:_end_
        mov ax,dx
        shr dx,4            ; Shift w/zeros fill
        test    ax,0fh
        jz  ts_1
        inc dx
ts_1:
        mov ax,3100h
        int 21h         ; DOS Services  ah=function 31h
                        ; TERMINATE & STAY RESIDENT
 
uninst:                                         ;
        push    ds                      ;
        mov ax,3515h                ;
        int 21h                     ;
        push    es                      ;
        mov ax,word ptr es:[old_isr15+2]
        mov ds,ax                   ;
        mov dx,word ptr es:[old_isr15]
        pop es                      ;
        mov ax,4900h                ;
        int 21h                     ;
        mov ax,2515h                ;
        int 21h                     ;
        pop ds                      ;
        mov dx,offset cs:unl        ;
        mov ah,9                    ;
        int 21h                     ;
        jmp quit                    ;
;
;       SUBROUTINE out_ax
;               perform call for output al,ah to port 60h
 
out_ax      proc    near
        call    xfr
        xchg    ah,al
        call    xfr
        retn
out_ax      endp
;
;       SUBROUTINE xfr
;               perform output to port 60h with delay for I/O
xfr     proc    near
        out 60h,al          ; port 60h, keybd data write
        mov cx,9FFFh
$d1:        loop    $d1         ; Loop if cx > 0
        retn
xfr     endp
;
sw_info:    db  'Use <LeftShift><LeftAlt> for toggle', 0Ah, 0Dh, '$'
loaded:     db  'KB: -- already active.', 0Ah, 0Dh, '$'
unl:        db  'KB: -- Unloaded.',10,13,'$'
bad_news:   db  'KB: -- FATAL -- Keyboard intercept feature not supported.',10,13,'$'
 
seg_a       ends
 
 
 
        end start
И скачай Ralf Brown's Interrupt List
Цитата Сообщение от Ralf Brown
INT 15 C - KEYBOARD - KEYBOARD INTERCEPT (AT model 3x9,XT2,XT286,CONV,PS)
AH = 4Fh
AL = hardware scan code (see #00006)
CF set
Return: CF set to continue processing scan code
AL = possibly-altered hardware scan code (see #00006)
CF clear
scan code should be ignored

Notes: called by INT 09 handler to translate scan codes; the INT 09 code does
not examine the scan code it reads from the keyboard until after
this function returns. This permits software to rearrange the
keyboard; for example, swapping the CapsLock and Control keys, or
turning the right Shift key into Enter.
DOS 6 KEYB.COM will not pass through this function if Ctrl-Alt-Del is
pressed and a SmartDrive v4-compatible cache is installed which has
dirty cache buffers; some other disk caches such as HyperDisk
operate similarly in order to prevent loss of cached data which has
not yet been written to disk
IBM classifies this function as required
1
1 / 1 / 0
Регистрация: 20.09.2010
Сообщений: 36
08.10.2011, 12:16  [ТС]
Charles Kludge, всё,понял,благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.10.2011, 12:16
Помогаю со студенческими работами здесь

Проверка нажатия клавиши
Написать программу, которая проверяет нажатие клавиш Alt+F10 , а также буквы &quot;P&quot; и &quot;U&quot;.

Присвоить переменной код нажатия клавиши
объявлена переменная в разделе Var, нужно ей присвоить код нажатия клавиши стрелка вверх

Стирание текущей строки в консоли после нажатия клавиши escape
Здравствуйте, я написал программу, которая вводит и выводит числа в десятичной системе счисления. Хочу поинтересоваться возможно ли...

Написать макросы: установки курсора, записи символа и атрибута, ожидания нажатия клавиши
Напишите макросы и оформите их в виде библиотеки: • macro cur – установка курсора • macro print - запись символа и атрибута • macro...

Реализация ожидания нажатия клавиши в asm
Возможно кто-то сталкивался с данным вопросом ранее, Как реализовать проверку нажатия клавиши к примеру(shift) т.е пока нажата клавиша -...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru