Работа с клавиатурой, событие нажатия и отжатия клавиши |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Работа с клавиатурой, событие нажатия и отжатия клавиши |
Capitan Nemo |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
Кому не трудно, выделите , пожалуйста, минут 10-15 своего времени...
с этим вопросом уже обращался, с тех пор вычитал немерено разной инфы, скачал много модулей, но недостаточно моих знаний, чтоб это понять! а курсовик сделать надо... нужно сделать, чтоб при нажатии клавиши клавиатуры воспроизводился звук, например sound(200), а при отпускании клавиши прекращался... Я находил несколько модулей, в которых есть такая возможность... но как конкретно - не могу понять... вот модули, в которых это есть: http://forum.sources.ru/index.php?showtopic=84101 http://www.ishodniki.ru/list/info.php?id=3889 не кидайте, пожалуйста, ссылки на какой-нибудь очередной модуль или типа того... помогите, пожалуйста, для конкретно моей работы. |
volvo |
Сообщение
#2
|
Гость |
Я же по-моему тебе говорил (или не тебе?), как это можно сделать: читаешь скан-код клавиши, если он меньше 128, значит, клавиша нажата - запускаешь звук... Если же скан-код больше 128, значит клавиша отпущена, звук надо останавливать...
|
Capitan Nemo |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
сканкод считывается через readkey?
|
volvo |
Сообщение
#4
|
Гость |
Нет... Для этого надо писать или обработчик прерывания, или через массив Port ...
|
Capitan Nemo |
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
а прерывание, как я понимаю через asm?
|
volvo |
Сообщение
#6
|
Гость |
Совсем не обязательно... Вот тут, например, смотри в аттаче, как получают скан-код:
прерывания |
Capitan Nemo |
Сообщение
#7
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
пытаюсь разобраться с кодом - но многое непонятно...
не смог понять что делает процедура New9... что необходимо сделать мне для считывания скан-кода? Scan := Port[ $60 ] - здесь что-то инициализируется? ЗЫ был бы безумно признателен, если б кто-нибудь набросал код необходимый мне... ну не как ен могу разобраться... не мой это уровень... мне препод сказал: "не сделаешь это - больше 4 не поставлю"... но он когда это говорил - был уверен, что функция keypressed возвращает состояние клавиши (нажата или нет в данный момент)... Возможно, завтра у меня все и так разрулится... а возможно нет... поэтому очень необходимо все-таки реализовать поставленную задачу... |
volvo |
Сообщение
#8
|
Гость |
Цитата Scan := Port[ $60 ] - здесь что-то инициализируется? Здесь Скан-код нажатой (или отпущенной) клавиши записывается в переменную Scan... Все, его можно анализировать! Только делать это желательно в основной программе, и уж тем более включать/выключать звук - это довольно длительные действия, а процедура обработки прерывания должна как можно быстрее возвращать управление... Поэтому переменную Scan описывай глобально, и как только действия по нажатию/отпусканию произведены (т.е., ты поймал момент и включил/выключил звук), Scan обнуляй... Сейчас покажу... Добавлено через 15 мин. Вот, смотри: uses dos, crt; Жми кнопку, выйдет сообщение, что нажал. Пока не отпустишь - больше никаких сообщений не будет. Вместо вывода сообщения поставь то, что закомментировано. Вот и все... P.S. Могут быть проблемы с F11, F12 - у них разные скан-коды на разных клавиатурах... Сообщение отредактировано: volvo - |
Capitan Nemo |
Сообщение
#9
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
огромнейшее спасибо!!!!!
наберусь наглости попросить несколько комментариев по основным этапам сего действия... Чтоб я хоть мог объяснить как я это сделал) |
volvo |
Сообщение
#10
|
Гость |
Комментарии добавлены...
|
Capitan Nemo |
Сообщение
#11
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
Огромнейшее спасибо!!!
Вы спасли брянского студента от мозголюбства от препода)) |
Capitan Nemo |
Сообщение
#12
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
встроил эту штуку в свою программу...
все работает. но с багом... иногда, когда нажму на клавишу - звук начинается, отпускаю - он не прерывается... если еще раз нажму на эту клавишу и подержу подольше - все нормально становится... что это может быть, не знаете? |
Capitan Nemo |
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
все, разобрался, все исправно работает)
только один нюанс: почему, когда нажимаешь клавиши раз в пятый в колонках раздается звук... кстати, так же и с программой, описанной выше volvo Добавлено через 3 мин. и еще вопрос. на этот раз уж точно последний) как установить задержку на определенное число миллисекунд, кроме как через delay? |
volvo |
Сообщение
#14
|
Гость |
Потому, что я совсем забыл чистить буфер клавиатуры... Когда ты нажимаешь клавишу, ее Ascii-код попадает в буфер, однако оттуда ничем не читается. Буфер переполняется, и начинается писк.
|
Capitan Nemo |
Сообщение
#15
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
и как это исправить? как очистить буфер?
Добавлено через 11 мин. readkey, по ходу) Добавлено через 2 мин. а насчет задержки вот что мне нужно: при входе в цикл, если клавиша нажата - я засекаю системное время, при выходе - когда клавиша отжата - засекаю время... отнимаю от конечного начальное, умножаю секунды, прибавляю миллисек, в общем, получаю длительность в миллисекундах.... затем, в другой процедуре я использую эту длительность для воспроизведения... если ставлю delay(кол-во миллисекунд) он делает не такую паузу, как надо... слишком быстро он, не по кол-ву миллисекунд... что можно сделать? |
volvo |
Сообщение
#16
|
Гость |
Зайди сюда и посмотри, что есть для работы со временем:
http://volvo71.narod.ru/time_count.htm |
Capitan Nemo |
Сообщение
#17
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
спасибо большое, пригодилась ссылка...
все-таки остается неясным. почему delay(ms) делает задержку не на ровно ms времени. а значительно меньше? можно ли как-нибудь точно сделать? |
Capitan Nemo |
Сообщение
#18
|
Новичок Группа: Пользователи Сообщений: 17 Пол: Мужской Реальное имя: Дмитрий Репутация: 0 |
пошарил по форуму, нашел)
спасибо за помощь! |
Текстовая версия | 11.01.2025 8:45 |