Тема: Запрет выполнения всех стандартных комманд ACAD

Можно ли запретить выполнение всех стандартных комманд (delete, move, help и пр.) и функций за исключением комманд, которые определены в модуле arx? Как вариант необходимо, чтобы при попытке, например, удаления предмета вызывалась соответствующая функция arx. В предыдущих версиях ACAD удавалось просто в лисповской программе используя undefine - defun, например, запретить удалять объекты по delete, а вызывать вместо этого свою функцию. Теперь этот номер не проходит так как при нажатии Delete вызывается комманда "_.erase", с которой таким способом не поборишься. Также не получается заменить вызов по F1 стандартной справки на свою. Если это сделать в CUI, то появляется сначало сообщение об ошибке, а затем моя справка.

Re: Запрет выполнения всех стандартных комманд ACAD

Можно ли запретить выполнение всех стандартных команд
Можно. Правда их все придется перечислить. :)
А если серьезно, то для решения вопроса с клавишей Del есть другое, значительно более простое решение (строк двадцать кода).
Смысл его - в InitApp регистрируется фильтр, а в UnloadApp убирается:

BOOL regFiltr;
BOOL filterProc(MSG *pMsg);
void InitApp()
{
   ...
 regFiltr = acedRegisterFilterWinMsg(filterProc);
}
void UnloadApp()
{
  if (regFiltr) acedRemoveFilterWinMsg(filterProc);
}
BOOL filterProc(MSG *pMsg)
{
  // Здесь проверяем pMSG на предмет
  // pMsg->message == WM_KEYDOWN и
  // pMsg->wParam == VK_DELETE
  // Если да, то запускаем
  // acedPostCommand("_ERASE ");
  // и возвращаем TRUE
}

Это в общих чертах. В действительности нужно еще проверить:
1) Не пустой ли ssfirst?
2) Пустая ли командная строка?
3) Сообщение пришло от какого из AutoCAD'овских окон?  Может быть от него Del не должно вызвать запуск _.erase?
Но это все действительно укладывается в двадцать строк кода.
Есть еще один способ:
1) Создаем своей реактор, производный от AcApDocManagerReactor.
2) Переопределим метод documentLockModeChanged
3) В этом методе проверим имя команды и если оно входит в список отвергаемых нами, то вызваем метод veto() для этого класса.

Re: Запрет выполнения всех стандартных комманд ACAD

> Александр Ривилис
Спасибо большое! Все действительно просто.