"Обработка нажатия ESC или . . ."
Василий Мошнинов ?subject=Articles">
[email protected]
Я бы предложил переписать функцию проверки на 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