ADN Open CIS
Сообщество программистов Autodesk в СНГ

29/02/2020

Как временно заблокировать интерфейс AutoCAD при помощи .NET и C++

При длительных операциях с AutoCAD иногда возникает потребность заблокировать его интерфейс, чтобы не дать возможность пользователю изменять чертеж. В AutoCAD API специальных средств для этого нет, но можно воспользоваться Win32 API.

Вот пример, как это можно сделать в .NET (https://www.keanw.com/2016/02/disabling-autocads-complete-ui-using-net.html) :

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.Runtime;
  3. using System;
  4. using System.Runtime.InteropServices;
  5.  
  6. namespace UserInterfaceManipulation
  7. {
  8.   public class Commands
  9.   {
  10.     [DllImport("user32.dll")]
  11.     static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
  12.  
  13.     [CommandMethod("DU")]
  14.     public static void DisableUICommand()
  15.     {
  16.       EnableUI(false);
  17.     }
  18.  
  19.     [CommandMethod("EU")]
  20.     public static void EnableUICommand()
  21.     {
  22.       EnableUI(true);
  23.     }
  24.  
  25.     public static void EnableUI(bool enable)
  26.     {
  27.       EnableWindow(Application.MainWindow.Handle, enable);
  28.     }
  29.   }
  30. }

 

Вариант с использованием ObjectARX и MFC:

Код - C++: [Выделить]
  1. static void DisableUI ()
  2. {
  3.     CMDIFrameWnd *frame = acedGetAcadFrame();
  4.     // Disable AutoCAD Frame, Ribbon, Toolbars, etc.
  5.     frame->EnableWindow(FALSE);
  6.     // Invoke progressbar
  7.     acedSetStatusBarProgressMeter(_T("Loading My Critical Data"), 0, 10);
  8.     for (int i = 0; i < 10; i++)
  9.     {
  10.      Sleep(1000); // Только для тестирования
  11.      acedSetStatusBarProgressMeterPos(i);
  12.     }
  13.     acedRestoreStatusBar();
  14.     // Enable AutoCAD Frame, Ribbon, Toolbars, etc.
  15.     frame->EnableWindow(TRUE);
  16. }


Также можно воспользоваться функцией BlockInput();

Код - C++: [Выделить]
  1. BlockInput(true); // Блокирует клавиатуру и мышь
  2. BlockInput(false); // Разблокирует клавиатуру и мышь

В .NET это можно использовать через P/Invoke:

Код - C#: [Выделить]
  1. [return: MarshalAs(UnmanagedType.Bool)]
  2. [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
  3. public static extern bool BlockInput([In, MarshalAs(UnmanagedType.Bool)] bool fBlockIt);


 

 

Автор: Александр Ривилис
Опубликовано 29.02.2020
Отредактировано 29.02.2020 в 21:07:58