Помощь - Поиск - Пользователи - Календарь
Полная версия: Опрос клавиатуры
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
RockFan
Помогите решить проблему!Нужно определить каждую клавишу на клавиатуре через прерывание!В этой версии при нажатии на функциональные клавиши или стрелочки выдается сообщение о нажатии левого Шифта!Как это исправить?И как определить клвишы у которых скен коды больше 255(num look например)?


uses dos, crt;
Var
Shift, RightShift,PrintScr,CapsLook,ScrollLook: boolean;
Ctrl, Alt, exit,NumLook,F11,F12,Up: boolean;
Old_09: Pointer;
SvInt9: procedure;

{$f+}
Procedure New9; Interrupt;
Var
Scan: integer;
Begin
Scan := Port[ $60 ];
Shift := (Scan = 42) or (Scan = 54);
if Shift then
RightShift := (scan = 54)
else begin
Ctrl := (scan = 29);
Alt := (scan = 56);
CapsLook := (scan = 58);
NumLook := (scan = 170);
PrintScr := (scan = 55);
ScrollLook := (scan = 70);
F11:=(scan = 87);
F12:=(scan = 88);
NumLook:=(scan = 325);
Up:=(scan = 328);
exit := (scan = $01);
end;

Inline( $9C );
SvInt9;
End;
{$f-}

Procedure Klavisha;
var key: char;

begin
key:= readkey;
if key<>#0 then
begin
case key of
#8 : writeln ('BackSpace ');
#9 : writeln ('Tab ');
#13 : writeln ('Enter ');
#27 : writeln ('Esc ');
#32 : writeln ('Џа®ЎҐ« ');
else
writeln (Key);
end;
end
else
begin
key:=readkey;
case key of
#59..#68 : writeln('F',ord(key)-58);
#71: writeln('Home');
#72: writeln('Up');
#73: writeln('PageUp');
#75: writeln('Left');
#77: writeln('Right');
#79: writeln('End');
#80: writeln('Down');
#81: writeln('PageDown');
#82: writeln('Ins');
#83: writeln('Del');
end;
end;
end;

BEGIN
GetIntVec($9, @SvInt9);
SetIntVec($9, @New9);

repeat
if keypressed then
Klavisha
else
if Shift then begin
if RightShift
then write('Right ')
else write('left ');
writeln('Shift ');
Shift := false;
end
else
if Ctrl then begin
writeln('Control ');
Ctrl := false
end
else
if Alt then begin
writeln('Alt ');
Alt := false
end
else
if Capslook then begin
writeln('CapsLook ');
CapsLook := false;
end

else
if ScrollLook then begin
writeln('ScrollLook ');
ScrollLook := false;
end
else
if F11 then begin
writeln('F11 ');
F11 := false;
end
else
if F12 then begin
writeln('F12 ');
F12 := false;
end
else
if NumLook then begin
writeln('NumLook ');
NumLook := false;
end;



until exit;

SetIntVec($9, @SvInt9);
END.
volvo
Очень странно... У меня все правильно работает, отображаются как все Lock-и, так и Fxx, и стрелочки... Только исправь скан-код NumLock и убери вторую строку:

      else     begin
Ctrl := (scan = 29);
Alt := (scan = 56);
CapsLook := (scan = 58);
NumLook := (scan = 69); { <--- Здесь - исправить ... }
PrintScr := (scan = 55);
ScrollLook := (scan = 70);
F11:=(scan = 87);
F12:=(scan = 88);
{ NumLook:=(scan = 325); } { <--- ... а это - убрать }
Up:=(scan = 328);
exit := (scan = $01);
end;

RockFan
Спасибо большое!А как прописать скан код для PrintSCR и Break.Я уже все пересмотрел, везде либо больше 255 или вообще нет!Подскажите код?
А вот что выдает Паскаль при нажатии Стрелочек, в этой программе:
Нажмите для просмотра прикрепленного файла
Картинка прилогается.

Принажатии на DEl, INS, ..., будет тоже самое только с др. клавишей!(DEl, INS, ..., соответственно вместо стрелочек).Получается что он использует один скан-код для несколька клавиш?
volvo
Код PrintScreen должен быть = 55, а код Break у меня совпадает с кодом ScrollLock, потому что это физически одна клавиша, для моей клавиатуры надо анализировать состояние FLock ...
TarasBer
Там ещё как то влияет случай когда scan=224. В общем, посмотрите мой вариант процедуры Ntw09. Я там правда для экономии памяти битовыми операциями увлёкся, но, надеюсь, разберётесь. И ещё, я не понял насчёт строчки Scan = 328... По-моему, scan не может оказаться больше 255, хотя бы потому, что ему присваивается Port[$60], а не PortW[$60]. А чтоб понять какая клавиша что значит - напишите тестовую программку.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.