Запрет всплывания диалоговых окон в AutoCAD
Большинство появляющихся диалоговых окон AutoCAD могут быть подавлены при необходимости при помощи ряда системных переменных или вызова команды с предшествующим знаком "-" для вызова команды в режиме командной строки. Вы можете прочитать об этом в этой статье:Переключение между диалоговыми окнами и командной строкой (англ)
Кроме того, для пакетной обработки чертежей значительно больше подходят AcCoreConsole или AutoCAD.IO, и они не имеют ограничений связанных с появляющимися в процессе работы диалогами. Чтобы узнать об этих вариантах , пожалуйста, обратитесь к следующим статьям:
Начало работы с AccoreConsole (англ)
Начало работы с AutoCAD.IO (англ)
Если вам по-прежнему необходимо знать как закрывать диалоговые окна внутри AutoCAD, вы можете попробовать использовать для этого хуки Windows. Пожалуйста, обратите внимание , что этот метод не рекомендуется, но так как это наиболее часто задаваемый запрос я отправил образец кода здесь. Этот пример кода использует CBT хуки в C# на основе этой статьи MSDN:
Как устанавливать хуки Windows в Visual C# .NET (англ)
Необходимо вызвать “SetupHook” до “RemoveHook” после кода, чтобы предотвратить появление ненужного диалога.
- // Например:
- // SetupHook();
- // ...Следующие действия могут привести к появлению диалога,
- // ...который необходимо закрыть.
- // RemoveHook();
- public delegate int HookProc(
- int nCode,
- IntPtr wParam,
- IntPtr lParam);
- // Объявляем метку хука как целое.
- static int hHook = 0;
- // Объявляем константу хука работы с окнами.
- // Для других типов хуков значения можно найти в
- // файле Winuser.h из Microsoft SDK.
- public const int WH_CBT = 5;
- public const uint WM_CLOSE = 0x0010;
- private static long HCBT_ACTIVATE = 5;
- private static long HCBT_CREATEWND = 3;
- // Объявляем процедуру-обработчик.
- HookProc CBTHookProcedure_;
- // Объявление функции SetWindowsHookEx.
- // Она устанавливает хуки.
- [DllImport("user32.dll", CharSet = CharSet.Auto,
- CallingConvention = CallingConvention.StdCall)]
- public static extern int SetWindowsHookEx(int idHook,
- HookProc lpfn, IntPtr hInstance, int threadId);
- // Объявление функции UnhookWindowsHookEx.
- // Вызов ее убирает хуки.
- [DllImport("user32.dll", CharSet = CharSet.Auto,
- CallingConvention = CallingConvention.StdCall)]
- public static extern bool UnhookWindowsHookEx(int idHook);
- // Объявление функции CallNextHookEx.
- // Вызов ее передает информации следующей функции в цепочке хуков
- [DllImport("user32.dll", CharSet = CharSet.Auto,
- CallingConvention = CallingConvention.StdCall)]
- public static extern int CallNextHookEx(int idHook,
- int nCode, IntPtr wParam, IntPtr lParam);
- [DllImport("user32.dll", CharSet = CharSet.Auto,
- SetLastError = true)]
- static extern int GetWindowText(IntPtr hWnd,
- System.Text.StringBuilder lpString, int nMaxCount);
- [DllImport("user32.dll")]
- static extern IntPtr GetActiveWindow();
- [DllImport("user32.dll", CharSet = CharSet.Auto)]
- static extern IntPtr SendMessage(IntPtr hWnd,
- UInt32 Msg, IntPtr wParam, IntPtr lParam);
- public static int CBTHookProcedure(int nCode,
- IntPtr wParam, IntPtr lParam)
- {
- if (nCode < 0)
- {
- return CallNextHookEx(
- hHook, nCode, wParam, lParam);
- }
- else
- {
- System.Text.StringBuilder wndName = new System.Text.StringBuilder(300);
- GetWindowText(GetActiveWindow(), wndName, 300);
- // Если в окне есть упоминание о AutoCAD Civil 3D - закрываем его
- if (!wndName.ToString().Contains("AutoCAD Civil 3D"))
- {
- SendMessage(GetActiveWindow(), WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
- }
- }
- return CallNextHookEx(hHook, nCode, wParam, lParam);
- }
- void SetupHook()
- {
- if (hHook == 0)
- {
- // Создаём экземпляр процедуры-обработчика хука.
- CBTHookProcedure_ = new HookProc(CBTHookProcedure);
- hHook = SetWindowsHookEx(WH_CBT, CBTHookProcedure_, (IntPtr)0, AppDomain.GetCurrentThreadId());
- // В случае ошибки SetWindowsHookEx.
- if (hHook == 0)
- {
- System.Windows.Forms.MessageBox.Show("Ошибка SetWindowsHookEx!");
- return;
- }
- }
- }
- void RemoveHook()
- {
- if (hHook != 0)
- {
- bool ret = UnhookWindowsHookEx(hHook);
- // В случае ошибки UnhookWindowsHookEx.
- if (ret)
- {
- hHook = 0;
- }
- }
- }
Источник: 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