Обработка события состояния главного окна AutoCAD

Автор Тема: Обработка события состояния главного окна AutoCAD  (Прочитано 6424 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Какое событие отвечает за состояние главного окна приложения?
Мне нужно в обработчике события определить статус главного окна AutoCAD (Normal, Maximum, Minimunm)
Т.е. нужно узнать состояние главного окна  AutoCAD (Свернуто или развернуто).
 

Все что пока смог придумать - это по таймеру проверать состояние переменной
 Autodesk.AutoCAD.ApplicationServices.Application.MainWindow.WindowState
« Последнее редактирование: 21-03-2016, 15:40:48 от Алексей (IdeaSoft) »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно через COM/ActiveX событие AcadApplication.WindowChanged
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Или вот так:
Код - 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. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Можно через 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. }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Я попробовал этот вариант. Почему-то события не срабатывают.
Я уже натыкался на проблемы с событиями изменения окна документа: http://adn-cis.org/forum/index.php?topic=3221.msg13384#msg13384
Но там оно хоть иногда срабатывало, а с главным окном приложения похоже не работает совсем. Видимо этот баг внесён в последних версиях, так как судя по этому: http://forums.augi.com/archive/index.php/t-134795.html в AutoCAD 2011 всё работало.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Дмитрий Загорулькин
Проверил твой код в AutoCAD 2012 - срабатывает один-два раза, а потом перестаёт. Если убрать Application.ShowAlertDialog, то срабатывает нормально acApp_WindowChanged, а вот acApp_WindowMovedOrResized не сработало ни разу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
У меня в AutoCAD Civil 3D as AutoCAD 2014 Rus ни разу не срабатывает ни то ни другое событие, даже если убрать Application.ShowAlertDialog. Ну да ладно, значит, это такая особенность событий/версии.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну да ладно, значит, это такая особенность событий/версии.
Хорошо хоть версия с Autodesk.AutoCAD.Internal.Reactors работает.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Ребята, спасибо за ответы попробую варианты посмотрю работает или нет.
Лет пять назад делал это в COM тоже были сложности то срабатывало тоже не всегда.
Сейчас COM уже для меня не актуален. т.к. все приложения уже перекодировал на NET.