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

Василий Мошнинов [vmoshninov@newmail.ru]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
наверх