IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Работа с клавиатурой, событие нажатия и отжатия клавиши
Capitan Nemo
сообщение 6.06.2007 19:13
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Кому не трудно, выделите , пожалуйста, минут 10-15 своего времени...
с этим вопросом уже обращался, с тех пор вычитал немерено разной инфы, скачал много модулей, но недостаточно моих знаний, чтоб это понять! а курсовик сделать надо...
нужно сделать, чтоб при нажатии клавиши клавиатуры воспроизводился звук, например sound(200), а при отпускании клавиши прекращался...

Я находил несколько модулей, в которых есть такая возможность... но как конкретно - не могу понять...

вот модули, в которых это есть:
http://forum.sources.ru/index.php?showtopic=84101
http://www.ishodniki.ru/list/info.php?id=3889


не кидайте, пожалуйста, ссылки на какой-нибудь очередной модуль или типа того... помогите, пожалуйста, для конкретно моей работы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 6.06.2007 20:36
Сообщение #2


Гость






Цитата
Scan := Port[ $60 ] - здесь что-то инициализируется?
Здесь Скан-код нажатой (или отпущенной) клавиши записывается в переменную Scan... Все, его можно анализировать! Только делать это желательно в основной программе, и уж тем более включать/выключать звук - это довольно длительные действия, а процедура обработки прерывания должна как можно быстрее возвращать управление...

Поэтому переменную Scan описывай глобально, и как только действия по нажатию/отпусканию произведены (т.е., ты поймал момент и включил/выключил звук), Scan обнуляй... Сейчас покажу...

Добавлено через 15 мин.
Вот, смотри:
uses dos, crt;
Var
wasShift, isRight: boolean;
isCtrl, isAlt, do_exit: boolean;
Old_09: Pointer;
KbdIntVec: procedure;

Var
Scan: Byte;

{$f+}
{ Ну, это - собственно процедура - обработчик прерывания, здесь все понятно }
Procedure New9; Interrupt;
Begin
Scan := Port[ $60 ]; { запоминаем скан-код нажатой клавиши в глобальной переменной }
do_exit := (scan = $01); { и смотрим, не нажат ли Escape, для выхода из программы }

Inline( $9C ); { здесь - вызываем старый обработчик прерывания }
KbdIntVec;
End;
{$f-}

var
checked: boolean;

BEGIN
{ запоминаем вектор прерывания 9H... причем, это делаем дважды: }
GetIntVec($9, @KbdIntVec); { Здесь - для удобного вызова с использованием процедурного типа }
GetIntVec($9, Old_09); { а здесь - чтобы потом иметь возможность восстановить текущее значение }
SetIntVec($9, Addr(New9)); { заменяем стандартную процедуру обработки на свою }

Scan := 128; checked := false; { начальные значения }

repeat
{ проверяем значения scan-кода }
case scan of
1 .. 127: { если здесь - то кнопка нажата }
begin
{
для того, чтобы не производить лишних действий -
если кнопка ДО ЭТОГО еще не была нажата, то устанавливаем флажок,
и производим необходимое действие один раз...
Если же факт нажатия кнопки уже зафиксирован установленным флагом -
то ничего не надо делать, только сбросить Scan в начальное значение
}
if not checked then begin
checked := true;
writeln('key pressed ... ');
{ sound(200); }
end;
Scan := 128;
end;
129 .. 255: { если здесь - то клавиша была отпущена (скан-код увеличен на 128) }
begin
{
в принципе, эту проверку можно было бы и не производить, но я уже сделал
по аналогии с обработкой нажатия клавиши...
}
if checked then begin
checked := false;
writeln('key released ... ');
{ nosound; }
end;
Scan := 128;
end;
end;

until do_exit; { цикл закончится только тогда, когда будет нажата кнопка Escape }

{ восстанавливаем ранее сохраненный вектор прерывания перед выходом из программы }
SetIntVec($9, Old_09);
END.


Жми кнопку, выйдет сообщение, что нажал. Пока не отпустишь - больше никаких сообщений не будет. Вместо вывода сообщения поставь то, что закомментировано. Вот и все...

P.S. Могут быть проблемы с F11, F12 - у них разные скан-коды на разных клавиатурах...

Сообщение отредактировано: volvo - 6.06.2007 22:50
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Capitan Nemo   Работа с клавиатурой   6.06.2007 19:13
volvo   Я же по-моему тебе говорил (или не тебе?), как это...   6.06.2007 19:29
Capitan Nemo   сканкод считывается через readkey?   6.06.2007 19:31
volvo   Нет... Для этого надо писать или обработчик прерыв...   6.06.2007 19:35
Capitan Nemo   а прерывание, как я понимаю через asm?   6.06.2007 19:37
volvo   Совсем не обязательно... Вот тут, например, смотри...   6.06.2007 19:47
Capitan Nemo   пытаюсь разобраться с кодом - но многое непонятно....   6.06.2007 20:18
volvo   Здесь Скан-код нажатой (или отпущенной) клавиши за...   6.06.2007 20:36
Capitan Nemo   огромнейшее спасибо!!!!! набе...   6.06.2007 21:13
volvo   Комментарии добавлены...   6.06.2007 22:49
Capitan Nemo   Огромнейшее спасибо!!! Вы спасли брянс...   6.06.2007 22:51
Capitan Nemo   встроил эту штуку в свою программу... все работает...   7.06.2007 1:17
Capitan Nemo   все, разобрался, все исправно работает) только од...   7.06.2007 23:03
volvo   Потому, что я совсем забыл чистить буфер клавиатур...   7.06.2007 23:11
Capitan Nemo   и как это исправить? как очистить буфер? Добавлен...   7.06.2007 23:13
volvo   Зайди сюда и посмотри, что есть для работы со врем...   7.06.2007 23:29
Capitan Nemo   спасибо большое, пригодилась ссылка... все-таки о...   8.06.2007 0:10
Capitan Nemo   пошарил по форуму, нашел) спасибо за помощь!   8.06.2007 1:32


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 22.06.2025 1:20
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"