Обработка нажатия ESC или Авторам долгодумающих плагинов посвящается

Programming Far Manager plugins

Обработка нажатия ESC или "Авторам долгодумающих плагинов посвящается..."

Иван Синтюрин ?subject=Articles"> [spinoza@mail.ru][email protected]

Очередное воззвание к народу:

ДЕЛАЙТЕ ПЛАГИНЫ ИНТЕРАКТИВНЫМИ!

Это в общем, а в частном...

Написали вы свой супер-пупер-мега-плагин. Замечательно! Если он делает своё тёмное/светлое :-) дело быстро, за доли секунды, то можете дальше не читать. А если некоторые операции, осуществляемые плагином, требуют определённого времени, то следует обязательно обрабатывать в плагине нажатие ESC (или чего-нибудь ещё).

Зачем? Пользователь - существо странное, вдруг он запустил ваш плагин по ошибке (или тот самостоятельно запустился, что не меняет сути дела) или сознательно, но резко передумал. Как ему быть в данной ситуации? FAR убивать? А плагин думает, работает, а пользователь волосы на себе рвёт и проклинает Вас. Выход прост - плагин должен реагировать (интерактивность!) на нажатие клавиши «ESC» (Escape - бегство, бурж.). Для этого можно использовать, например, следующую функцию (за основу взята функция из файла Examples\MultiArc\ARCMIX.CPP):

bool CheckForEsc(void)
{
 bool EC=false;
 INPUT_RECORD rec;
 static HANDLE hConInp=GetStdHandle(STD_INPUT_HANDLE);
 DWORD ReadCount;
 while (1)
 {
  PeekConsoleInput(hConInp,&rec;,1,&ReadCount;);
  if (ReadCount==0) break;
  ReadConsoleInput(hConInp,&rec;,1,&ReadCount;);
  if (rec.EventType==KEY_EVENT)
     if (rec.Event.KeyEvent.wVirtualKeyCode==VK_ESCAPE &&
         rec.Event.KeyEvent.bKeyDown) EC=true;
 }
 return(EC);
}

Дальше, где нужно, пишем что-то типа:

...
if(CheckForEsc()) ... //реакция на нажатие ESC, например, выход из плагина
else ... //работаем дальше
...

That's all, folks :-)

 
13.12.1999
Rev. 06.09.2000