Василий Мошнинов
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