Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 16.10.2020
Сообщений: 29
MASM32

Как в программе определяется, какая клавиша нажата?

03.01.2022, 12:32. Показов 1754. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
;Консольное приложение для win32, перечисляющее сетевые ресурсы
include console.inc
.386
.model FLAT,STDCALL
.data
num_msg1 db 'NumLock',0
num_msg2 db 'CapsLock',0
num_msg3 db 'ScrollLock',0
buffer2 byte 20 dup(?)
real dd ?
NumberOfChars DWORD ?
buffer1 byte 20 dup (?)
hconsoleInput DWORD ?
hconsoleOutPut DWORD ?
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
.code
_start:
; получим от системы идентификатор буфера вывода stdout
      call GetStdHandle,STD_OUTPUT_HANDLE
      mov hconsoleOutPut,EAX
      call GetStdHandle,STD_INPUT_HANDLE,EAX
      mov hconsoleInput,EAX ;возвращает идентификатор INPUT в eax
 
m1:   call ReadConsoleInputA,hconsoleInput,offset buffer1,1,offset NumberOfChars
      mov ESI,offset buffer1
      cmp [ESI],dword ptr 1h
      jne m1
      ;cmp [ESI],dword ptr 0h
      ;jz m1
      ;найти call Beep
      call Beep,4186,200
      mov al,[ESI+14]
      cmp al,'z'
      je Exit
      mov EAX,[ESI+16]
      bt EAX,5
      jc num
      bt EAX,6
      jc caps
      bt EAX,7
      jc scroll
      jmp m1
num:
      mov esi,offset num_msg1
      call WriteConsoleA,hconsoleOutPut,esi,7,offset real,0
      jmp m1
scroll:
      mov esi,offset num_msg2
      call WriteConsoleA,hconsoleOutPut,esi,8,offset real,0
      jmp m1
caps:
      mov esi,offset num_msg3
      call WriteConsoleA,hconsoleOutPut,esi,10,offset real,0
      jmp m1
 
;      mov  ebx,0 ; EBX- номер байта буфера 1(события)
;      mov  ecx,0 ; ECX- номер байта буфера 2(форматирования)
      Exit: call ExitProcess,0
      end _start
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.01.2022, 12:32
Ответы с готовыми решениями:

Определить, какая клавиша была нажата Tab или Ctrl-I, при условии, что они имеют одинаковые ASCII-коды
Народ, помогите кто знает, плиз! Нужно определить какая клавиша была нажата Tab или Ctrl-I, при условии, что они имеют одинаковые...

Как узнать какая нажата клавиша?
без обработчика программа должна понять какая нажата клавиша, даже если окно этой программы не активно... пробовывал !kbhit не...

Как распознать,какая клавиша была нажата
Здравствуйте! Я пишу в MASM32 и столкнулся с проблемой: нужно, что бы при нажатии клавиши <Q> окно закрывалось. Как я понял, должно...

3
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.01.2022, 12:55
Мне кажется, что никак.
А что - у вас работает и при нажатии на NumLock, CapsLock и ScrollLock корректно выводит сообщения?
0
0 / 0 / 0
Регистрация: 16.10.2020
Сообщений: 29
03.01.2022, 13:45  [ТС]
ФедосеевПавел, суть программы в том что бы нажатие на эти 3 клавишы отображалось в консоли и сопровождалось звуком. И я не могу понять как в программе определяется, какая клавиша нажата?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.01.2022, 17:58
Мне казалось, что ответ невозможно интерпретировать иначе. Хорошо, повторю.

Ваша программа не определяет ситуацию нажатия на эти клавиши и не выводит диагностические сообщения.

Единственно, могу предположить, что русский язык - не родной для вас, поэтому столь нечёткая постановка вопроса.
Если вопрос предполагался: "Какой функцией WinAPI можно определить нажатие клавиш NumLock, CapsLock и ScrollLock?"
То ответ GetAsyncKeyState
https://docs.microsoft.com/en-... nckeystate
https://docs.microsoft.com/en-... -key-codes
и пример ожидания нажатия Left Alt
Assembler
1
2
3
4
5
6
7
        ;ожидание нажатия Left Alt
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressLeftAlt,\
                LENGTHOF aszPressLeftAlt - 1, ADDR BufLen, NULL
        @@WaitForLAlt:
                invoke  GetAsyncKeyState, VK_LMENU
                and     eax,    8000h
        jz      @@WaitForLAlt
Добавлено через 3 часа 58 минут
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
.686
.model flat, stdcall
option casemap :none
.nolist
        include \masm32\include\windows.inc
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\msvcrt.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\msvcrt.lib
.xlist
 
.const
        aszMsgNumLock_P         db      "NumLock pressed", 0
        aszMsgNumLock_R         db      "NumLock release", 0
        aszMsgCapsLock_P        db      "CapsLock pressed", 0
        aszMsgCapsLock_R        db      "CapsLock release", 0
        aszMsgScrollLock_P      db      "ScrollLock pressed", 0
        aszMsgScrollLock_R      db      "ScrollLock release", 0
        aszPressEscToExit       db      "Press ESC to exit...", 0
.data
.data?
        bNumLock_State          dd      ?
        bCapsLock_State         dd      ?
        bScrollLock_State       dd      ?
.code
 
TestKey macro   KeyCode, KeyState, asPressKey, asReleaseKey
        local   exit
        invoke  GetAsyncKeyState,       KeyCode
        and     eax,    8000h
        cmp     KeyState,       eax
        je      exit
                mov     KeyState,       eax
                test    eax,    eax
                mov     eax,    OFFSET asPressKey
                mov     ebx,    OFFSET asReleaseKey
                cmovz   eax,    ebx
                invoke  crt_puts,       eax
        exit:
endm
 
main    proc
        invoke  crt_puts,       ADDR aszPressEscToExit
        @@do:
                TestKey VK_CAPITAL, bCapsLock_State, aszMsgCapsLock_P, aszMsgCapsLock_R
                TestKey VK_NUMLOCK, bNumLock_State, aszMsgNumLock_P, aszMsgNumLock_R
                TestKey VK_SCROLL, bScrollLock_State, aszMsgScrollLock_P, aszMsgScrollLock_R
                invoke  GetAsyncKeyState,       VK_ESCAPE
                and     eax,    8000h
        jz      @@do
 
        invoke  ExitProcess, 0
main    endp
.nolist
end     main
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.01.2022, 17:58
Помогаю со студенческими работами здесь

Как определять, какая клавиша была нажата?
1) как определять, какая клавиша была нажата? 2) как определить время, которое проходит между нажатиями клавиш?

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

Как узнать, какая клавиша была нажата в Word
Т. е. смысл в чём? Я ввожу текст в документ и если нажал определённую клавишу, то должно выскочить сообщение. Обработки события нажатия...

Как узнать какая буквенная клавиша была нажата?
Что-то я не соображу. Как узнать какая буквенная клавиша была нажата? Проблема именно с русским языком.

Как глобально определить, какая клавиша была нажата?
хочу написать что то вроде клав. шпиона... но кроме tab esc up down итд... я ничего отловить не могу.... подскажите как заставить винды...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru