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

10/04/2015

Запрет всплывания диалоговых окон в AutoCAD

Большинство появляющихся диалоговых окон AutoCAD могут быть подавлены при необходимости при помощи ряда системных переменных или вызова команды с предшествующим знаком "-" для вызова команды в режиме командной строки. Вы можете прочитать об этом в этой статье:

Переключение между диалоговыми окнами и командной строкой (англ)

Кроме того, для пакетной обработки чертежей значительно больше подходят AcCoreConsole или AutoCAD.IO, и они не имеют ограничений связанных с появляющимися в процессе работы диалогами. Чтобы узнать об этих вариантах , пожалуйста, обратитесь к следующим статьям:

Начало работы с AccoreConsole (англ)

Начало работы с AutoCAD.IO (англ)

Если вам по-прежнему необходимо знать как закрывать диалоговые окна внутри AutoCAD, вы можете попробовать использовать для этого хуки Windows. Пожалуйста, обратите внимание , что этот метод не рекомендуется, но так как это наиболее часто задаваемый запрос я отправил образец кода здесь. Этот пример кода использует CBT хуки в C#  на основе этой статьи MSDN:

Как устанавливать хуки Windows в Visual C# .NET (англ)

Необходимо вызвать “SetupHook” до “RemoveHook” после кода, чтобы предотвратить появление ненужного диалога.

Код - C#: [Выделить]
  1. // Например:     
  2. //    SetupHook();
  3. //    ...Следующие действия могут привести к появлению диалога, 
  4. //    ...который необходимо закрыть.
  5. //    RemoveHook();
  6.  
  7. public delegate int HookProc(
  8.       int nCode,
  9.       IntPtr wParam,
  10.       IntPtr lParam);
  11.  
  12. // Объявляем метку хука как целое.
  13. static int hHook = 0;
  14.  
  15. // Объявляем константу хука работы с окнами.
  16. // Для других типов хуков значения можно найти в
  17. // файле Winuser.h из Microsoft SDK.
  18. public const int WH_CBT = 5;
  19.  
  20. public const uint WM_CLOSE = 0x0010;
  21.  
  22. private static long HCBT_ACTIVATE = 5;
  23. private static long HCBT_CREATEWND = 3;
  24.  
  25. // Объявляем процедуру-обработчик.
  26. HookProc CBTHookProcedure_;
  27.  
  28. // Объявление функции SetWindowsHookEx.
  29. // Она устанавливает хуки.
  30. [DllImport("user32.dll", CharSet = CharSet.Auto,
  31.   CallingConvention = CallingConvention.StdCall)]
  32. public static extern int SetWindowsHookEx(int idHook,
  33.   HookProc lpfn, IntPtr hInstance, int threadId);
  34.  
  35. // Объявление функции UnhookWindowsHookEx.
  36. // Вызов ее убирает хуки.
  37. [DllImport("user32.dll", CharSet = CharSet.Auto,
  38.   CallingConvention = CallingConvention.StdCall)]
  39. public static extern bool UnhookWindowsHookEx(int idHook);
  40.  
  41. // Объявление функции CallNextHookEx.
  42. // Вызов ее передает информации следующей функции в цепочке хуков 
  43. [DllImport("user32.dll", CharSet = CharSet.Auto,
  44.   CallingConvention = CallingConvention.StdCall)]
  45. public static extern int CallNextHookEx(int idHook,
  46.   int nCode, IntPtr wParam, IntPtr lParam);
  47.  
  48. [DllImport("user32.dll", CharSet = CharSet.Auto,
  49.   SetLastError = true)]
  50. static extern int GetWindowText(IntPtr hWnd,
  51.   System.Text.StringBuilder lpString, int nMaxCount);
  52.  
  53. [DllImport("user32.dll")]
  54. static extern IntPtr GetActiveWindow();
  55.  
  56. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  57. static extern IntPtr SendMessage(IntPtr hWnd,
  58.   UInt32 Msg, IntPtr wParam, IntPtr lParam);
  59.  
  60. public static int CBTHookProcedure(int nCode,
  61.   IntPtr wParam, IntPtr lParam)
  62. {
  63.   if (nCode < 0)
  64.   {
  65.     return CallNextHookEx(
  66.       hHook, nCode, wParam, lParam);
  67.   }
  68.   else
  69.   {
  70.     System.Text.StringBuilder wndName = new System.Text.StringBuilder(300);
  71.     GetWindowText(GetActiveWindow(), wndName, 300);
  72.     // Если в окне есть упоминание о AutoCAD Civil 3D - закрываем его
  73.     if (!wndName.ToString().Contains("AutoCAD Civil 3D"))
  74.     {
  75.       SendMessage(GetActiveWindow(),  WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
  76.     }
  77.   }
  78.   return CallNextHookEx(hHook, nCode, wParam, lParam);
  79. }
  80.  
  81. void SetupHook()
  82. {
  83.   if (hHook == 0)
  84.   {
  85.     // Создаём экземпляр процедуры-обработчика хука.
  86.     CBTHookProcedure_ = new HookProc(CBTHookProcedure);
  87.  
  88.     hHook = SetWindowsHookEx(WH_CBT, CBTHookProcedure_,  (IntPtr)0, AppDomain.GetCurrentThreadId());
  89.  
  90.     // В случае ошибки SetWindowsHookEx.
  91.     if (hHook == 0)
  92.     {
  93.       System.Windows.Forms.MessageBox.Show("Ошибка SetWindowsHookEx!");
  94.       return;
  95.     }
  96.   }
  97. }
  98.  
  99. void RemoveHook()
  100. {
  101.   if (hHook != 0)
  102.   {
  103.     bool ret = UnhookWindowsHookEx(hHook);
  104.     // В случае ошибки UnhookWindowsHookEx.
  105.     if (ret)
  106.     {
  107.       hHook = 0;
  108.     }
  109.   }
  110. }

 

Источник: http://adndevblog.typepad.com/autocad/2015/04/dismissing-popup-dialogs-in-autocad.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=2620

Опубликовано 10.04.2015
Отредактировано 14.04.2015 в 00:44:43