# "Обработка нажатия ESC или . . ."

``Василий Мошнинов vmoshninov@newmail.ru``

Я бы предложил переписать функцию проверки на ESC по-другому. В своё время у меня были замечания по поводу того, что плагин ProxyFtp чистит буфер и нельзя делать «упреждающие нажатия» :)) клавиш. Поэтому такая функция была мной переписана вот так:

    function CheckForKey(vKey: word): boolean;
    const
      DELTA = 16;
    Type
      TInputRecArr = array[0..Pred(MaxInt div SizeOf(TInputRecord))] of TInputRecord;
    Var
      Console: THandle;
      InputRec: ^TInputRecArr;
      InputSize: DWORD;
      ReadSuccess: boolean;
      ReadCnt,i: DWORD;
    Begin
      result:= false;
      Console:= GetStdHandle(STD_INPUT_HANDLE);
      InputSize:= 0;
      InputRec:= nil;

      try
        repeat
          Inc(InputSize, DELTA);
          MemRealloc(InputRec,InputSize*SizeOf(TInputRecord));
          ReadSuccess:= PeekConsoleInput(Console,InputRec^[0],InputSize,ReadCnt);
        until (not ReadSuccess) or (ReadCnt < InputSize);
        if ReadSuccess and (ReadCnt > 0) then
        begin
          for i:= 0 to Pred(ReadCnt) do
            if (InputRec^[i].EventType = KEY_EVENT) and
               (InputRec^[i].Event.KeyEvent.bKeyDown) and
               (InputRec^[i].Event.KeyEvent.wVirtualKeyCode = vKey) then
            begin
             result:= true;
             ReadConsoleInput(Console,InputRec^[0],Succ(i),ReadCnt);
             Break;
            end; { if }
        end; { if }
      finally
        MemRealloc(InputRec,0);
      end;
    end;

Эта функция не чистит буфер клавиатуры, если искомого кода там нет.

Вариант функции на C/C++:

    BOOL CheckForKey(WORD vKey)
    {
      INPUT_RECORD *InputRec;
      DWORD NumberOfEvents, ReadCnt,i;
      BOOL result = FALSE;
      HANDLE Console = GetStdHandle(STD_INPUT_HANDLE);

      if(GetNumberOfConsoleInputEvents(Console,&NumberOfEvents))
      {
        if((InputRec=(INPUT_RECORD *)GlobalAlloc(GPTR,
                                 NumberOfEvents*sizeof(INPUT_RECORD))) != NULL)
        {
          if(PeekConsoleInput(Console,InputRec,NumberOfEvents,&ReadCnt))
            if(ReadCnt <= NumberOfEvents)
              for(i=0; i < NumberOfEvents; ++i)
              {
                if (InputRec[i].EventType == KEY_EVENT &&
                    InputRec[i].Event.KeyEvent.bKeyDown &&
                    InputRec[i].Event.KeyEvent.wVirtualKeyCode == vKey)
                {
                  result=TRUE;
                  if(i > 0)
                    ReadConsoleInput(Console,InputRec,i,&ReadCnt);
                  break;
                }
              }
          GlobalFree((HGLOBAL)InputRec);
        }
      }
      return result;
    }

`
15.04.2000`
наверх