Помощь - Поиск - Пользователи - Календарь
Полная версия: Опрос клавиатуры
Форум «Всё о Паскале» > 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 ('Џа(r)ЎҐ« ');
                     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]. А чтоб понять какая клавиша что значит - напишите тестовую программку.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.