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

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 21-03-2016, 14:34:26

Название: Обработка события состояния главного окна AutoCAD
Отправлено: Алексей (IdeaSoft) от 21-03-2016, 14:34:26
Какое событие отвечает за состояние главного окна приложения?
Мне нужно в обработчике события определить статус главного окна AutoCAD (Normal, Maximum, Minimunm)
Т.е. нужно узнать состояние главного окна  AutoCAD (Свернуто или развернуто).
 

Все что пока смог придумать - это по таймеру проверать состояние переменной
 Autodesk.AutoCAD.ApplicationServices.Application.MainWindow.WindowState
Название: Re: Обработка события состояния главного окна AutoCAD
Отправлено: Александр Ривилис от 21-03-2016, 17:33:18
Можно через COM/ActiveX событие AcadApplication.WindowChanged
Название: Re: Обработка события состояния главного окна AutoCAD
Отправлено: Александр Ривилис от 21-03-2016, 19:13:55
Или вот так:
Код - C# [Выбрать]
  1. using System;
  2. using System.Diagnostics;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.Internal.Reactors;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.AutoCAD.Windows;
  7.  
  8. [assembly: CommandClass(typeof(MainWindowEvents.Utils))]
  9.  
  10. namespace MainWindowEvents
  11. {
  12.   public class Utils
  13.   {
  14.     static Window.State winState = Application.MainWindow.WindowState;
  15.     static bool wasSet = false;
  16.  
  17.     static public void appEventMgr_ApplicationMainWindowSized(object sender, EventArgs e)
  18.     {
  19.       Window.State curWinState = Application.MainWindow.WindowState;
  20.       if (curWinState != winState)
  21.       {
  22.         // Изменилось состояние окна
  23.         Debug.WriteLine("\nWindowState = {0}", curWinState);
  24.         winState = curWinState;
  25.       }
  26.     }
  27.  
  28.     //////////////////////////////////////////////////////////////////////////
  29.     // Включаем/отключаем обработку событий изменения размеров главного окна
  30.     //////////////////////////////////////////////////////////////////////////
  31.     [CommandMethod("MWReactors")]
  32.     public void MWReactors()
  33.     {
  34.       ApplicationEventManager appEventMgr = ApplicationEventManager.Instance();
  35.       if (!wasSet) {
  36.         appEventMgr.ApplicationMainWindowSized += appEventMgr_ApplicationMainWindowSized;
  37.       } else {
  38.         appEventMgr.ApplicationMainWindowSized -= appEventMgr_ApplicationMainWindowSized;
  39.       }
  40.       wasSet = !wasSet;
  41.     }
  42.   }
  43. }
Название: Re: Обработка события состояния главного окна AutoCAD
Отправлено: Дмитрий Загорулькин от 21-03-2016, 20:53:46
Можно через COM/ActiveX событие AcadApplication.WindowChanged
Я попробовал этот вариант. Почему-то события не срабатывают. Это моя первая попытка использовать события COM объектов в NET сборке, может что-то не так делаю?
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.Interop;
  3. using Autodesk.AutoCAD.Interop.Common;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. namespace AcadTests
  7. {
  8.     public class AcAppEvents
  9.     {
  10.         [CommandMethod("AcAppEventsTest")]
  11.         public void Run()
  12.         {
  13.             AcadApplication acApp = (AcadApplication)Application.AcadApplication;
  14.             acApp.WindowChanged += acApp_WindowChanged;
  15.             acApp.WindowMovedOrResized += acApp_WindowMovedOrResized;            
  16.         }
  17.  
  18.         void acApp_WindowMovedOrResized(int HWNDFrame, bool bMoved)
  19.         {
  20.             Application.ShowAlertDialog("Moved or resized!");
  21.         }
  22.  
  23.         void acApp_WindowChanged(AcWindowState WindowState)
  24.         {
  25.             Application.ShowAlertDialog(WindowState.ToString());
  26.         }
  27.     }    
  28. }
Название: Re: Обработка события состояния главного окна AutoCAD
Отправлено: Александр Ривилис от 21-03-2016, 21:45:30
Я попробовал этот вариант. Почему-то события не срабатывают.
Я уже натыкался на проблемы с событиями изменения окна документа: http://adn-cis.org/forum/index.php?topic=3221.msg13384#msg13384
Но там оно хоть иногда срабатывало, а с главным окном приложения похоже не работает совсем. Видимо этот баг внесён в последних версиях, так как судя по этому: http://forums.augi.com/archive/index.php/t-134795.html в AutoCAD 2011 всё работало.
Название: Re: Обработка события состояния главного окна AutoCAD
Отправлено: Александр Ривилис от 21-03-2016, 22:02:35
Дмитрий Загорулькин
Проверил твой код в AutoCAD 2012 - срабатывает один-два раза, а потом перестаёт. Если убрать Application.ShowAlertDialog, то срабатывает нормально acApp_WindowChanged, а вот acApp_WindowMovedOrResized не сработало ни разу.
Название: Re: Обработка события состояния главного окна AutoCAD
Отправлено: Дмитрий Загорулькин от 21-03-2016, 22:31:55
У меня в AutoCAD Civil 3D as AutoCAD 2014 Rus ни разу не срабатывает ни то ни другое событие, даже если убрать Application.ShowAlertDialog. Ну да ладно, значит, это такая особенность событий/версии.
Название: Re: Обработка события состояния главного окна AutoCAD
Отправлено: Александр Ривилис от 21-03-2016, 23:03:23
Ну да ладно, значит, это такая особенность событий/версии.
Хорошо хоть версия с Autodesk.AutoCAD.Internal.Reactors работает.

Название: Re: Обработка события состояния главного окна AutoCAD
Отправлено: Алексей (IdeaSoft) от 22-03-2016, 09:09:45
Ребята, спасибо за ответы попробую варианты посмотрю работает или нет.
Лет пять назад делал это в COM тоже были сложности то срабатывало тоже не всегда.
Сейчас COM уже для меня не актуален. т.к. все приложения уже перекодировал на NET.