16/07/2016
Как позволить пользователю прервать длительную операцию в AutoCAD .NET
Если у вас запущена длительная операция, то вам может понадобится возможность прервать эту операцию (при помощи клавиши ESC). Следующий код работал в AutoCAD 2007…2009, но он продолжает по-прежнему исправно работать и в AutoCAD 2017.
Код - C#: [Выделить]
- using System;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.EditorInput;
- [assembly: CommandClass(typeof(EscapeLoop.MyCommands))]
- namespace EscapeLoop
- {
- public class MyCommands
- {
- [CommandMethod("EscapeLoop")]
- static public void Loop()
- {
- Document doc =
- Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Editor ed = doc.Editor;
- // Создаем и добавляем фильтр сообщений
- MyMessageFilter filter = new MyMessageFilter();
- System.Windows.Forms.Application.AddMessageFilter(filter);
- //////////////////////////////////////////////////////////////////////////
- // Запускаем цикл
- //////////////////////////////////////////////////////////////////////////
- while (true)
- {
- // Проверяем не было ли пользовательского ввода
- System.Windows.Forms.Application.DoEvents();
- // Проверяем не установил ли наш фильтр флаг ESC
- if (filter.bCanceled == true)
- {
- ed.WriteMessage("\nЦикл прерван!");
- break;
- }
- ed.WriteMessage("\nВнутри цикла...");
- }
- // Мы закончили - удаляем фильтр
- System.Windows.Forms.Application.RemoveMessageFilter(filter);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- // Наш класс для фильтрации сообщений
- //////////////////////////////////////////////////////////////////////////
- public class MyMessageFilter : System.Windows.Forms.IMessageFilter
- {
- public const int WM_KEYDOWN = 0x0100;
- public const int WM_KEYUP = 0x0101;
- public bool bCanceled = false;
- public bool PreFilterMessage(ref System.Windows.Forms.Message m)
- {
- if (m.Msg == WM_KEYDOWN || m.Msg == WM_KEYUP)
- {
- // Проверяем не нажата ли клавиша ESC
- System.Windows.Forms.Keys kc =
- (System.Windows.Forms.Keys)(int)m.WParam & System.Windows.Forms.Keys.KeyCode;
- if (kc == System.Windows.Forms.Keys.Escape)
- {
- bCanceled = true;
- // Возвращаем true, чтобы показать, что мы обработали это сообщение
- return true;
- }
- }
- // Возвращаем false, чтобы сообщить, что мы не обрабатывали это сообщение
- return false;
- }
- }
- }
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7209
Опубликовано 16.07.2016