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

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

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

> Работа с клавиатурой, событие нажатия и отжатия клавиши
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 

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


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

 





- Текстовая версия 9.09.2025 8:04
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name