Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?

Автор Тема: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?  (Прочитано 15428 раз)

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

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Пример: если окно автокада активно - выполняется код и окно появляется нормально, в панеле задач окно появляется. А вот если окно автокада не активно - то окно в панеле задач не появляется и если перейти а autocad, то окно становится на заднем плане.   
Подскажите пожалуйста, как отобразить окно в потоке на переднем плане, например через 10 секунд (или по таймеру), если окно автокада не активно?
Код - C# [Выбрать]
  1. [CommandMethod("TestForm1", CommandFlags.Modal | CommandFlags.Session)]
  2. public void TestForm1()
  3. {
  4.              var tr = new Thread(delegate()
  5.                 {
  6.                     Form newform = new Form1();
  7.                     newform.TopLevel = true;
  8.                     newform.TopMost = true;
  9.                     newform.ShowInTaskbar = true;
  10.                     newform.Activate();
  11.                     Application.ShowModalDialog(newform);
  12.                 });
  13.              Thread.Sleep(5000);
  14.              tr.Start();
  15. }

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Открывать его не как дочернее окно автокада, а стандартным методом newform.ShowDialog();

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Application.ShowModalDialog(newform);
Насколько мне известно этот метод нельзя вызывать из отдельной Thread, т.к. AutoCAD .NET API не является потокобезопасным.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Вроде уже обсуждалось что newform.ShowDialog(); так нельзя, а нужно пользоваться автокадовскими

Как же тогда выводить окно например раз в час, если выполнились условия для этого ? Если потоками нельзя, то вообще никак? 

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как же тогда выводить окно например раз в час, если выполнились условия для этого ? Если потоками нельзя, то вообще никак? 
Может быть опишешь подробнее чего ты хочешь добиться?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вроде уже обсуждалось что newform.ShowDialog(); так нельзя, а нужно пользоваться автокадовскими

Как же тогда выводить окно например раз в час, если выполнились условия для этого ? Если потоками нельзя, то вообще никак? 

Все зависит от ваших нужд и от конкретной работы вашей программы. Иногда можно и нужно использовать newform.ShowDialog(); Тем более автокад не очень-то хорошо работает с потоками

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Нужно проверять изменились ли dwg в другой системе для текущего открытого dwg и если изменились, то показать окно со списком. Проверка осуществляется по заданному интервалу времени в настройках, например 1 раз в час.
« Последнее редактирование: 19-08-2015, 14:41:07 от Doublefish »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Нужно проверять изменились ли dwg в другой системе для текущего открытого dwg
Как идёт проверка изменилось или нет? По дате/времени файла? Тогда просто запусти таймер, в её функции-обработчике проверь изменился ли файл и оповести об этом пользователя.
Посмотри такой пример: http://adndevblog.typepad.com/autocad/2012/06/setting-up-a-timer-in-a-net-sample-that-uses-the-autocad-net-api.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
да - проверка идет по дате и по времени и нужно ещё из окна выполнитить действие
посмотрел по ссылке
как выполнить какое либо действие из всплывающей подсказки (там есть только text и hyperlink), никак?

попробовал создать контекстное меню - оно появляется, но как добраться до обработчика при нажатии на пункт контекстного меню?   
http://forums.autodesk.com/t5/net/contextmenu-from-statusbar/td-p/2614538
не работает?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
как выполнить какое либо действие из всплывающей подсказки (там есть только text и hyperlink), никак?
А причем здесь действие? Ты ведь говорил об оповещении пользователя, а не о том, что нужно будет предпринимать какие-то действия. Поэтому я и предложил такой вариант.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну и если ты действительно решил показывать контекстное меню, то тогда тебе в том примере нужно для добавления пункта меню использовать не метод:
Код - C# [Выбрать]
  1. Menu.MenuItemCollection.Add(String)
а метод:
Код - C# [Выбрать]
  1. Menu.MenuItemCollection.Add(String, EventHandler)
где EventHandler - обработчик события выбора пункта меню (для каждого пункта свой обработчик)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Здравствуйте, уважаемые форумчане!

Хочу лично написать слова благодарности Modis-у за его подсказку.

Действительно, все работает и очень просто:

1. Работаем в среде Visual Studio 2013 (VB.NET)
2. Создаем проект (Библиотека классов, по умолчанию Class1)
3. Создаем в проекте форму (Form1)
4. Подключаем библиотеки AcCoreMgd.dll, AcDbMgd.dll, свойство "КОПИРОВАТЬ ЛОКАЛЬНО=False"
5. В классе Class1 пишем код

Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3.  
  4. Public Class Class1
  5.     <Autodesk.AutoCAD.Runtime.CommandMethod("ShowMyForm")> _
  6.     Public Sub ShowMyForm()
  7.         Dim NewForm As New Form1
  8.         NewForm.ShowDialog()
  9.     End Sub
  10. End Class

6. Собираем решение
7. Запускаем AutoCAD
8. В командной строке пишем "NETLOAD" и указываем путь к сборке *.dll
9. В командной строке пишем "SHOWMYFORM" и любуемся результатом!

Modis, СПАСИБО!
« Последнее редактирование: 20-08-2015, 07:28:58 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Пашин Евгений
Приветствую на форуме.
1. Не забывай про правильное форматирование кода на форуме (смотри у меня в подписи).
2. В данном случае вместо
Код - vb.net [Выбрать]
  1. NewForm.ShowDialog()
должно быть
Код - vb.net [Выбрать]
  1. Application.ShowModalDialog(NewForm)
Да и подключить AcMgd.dll тоже очень желательно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Приношу свои извинения, первый раз на этом форуме.

Спасибо за подсказку  :)

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Проблема!

Подключил AcMgd.dll

Сделал как вы написали и перестало работать!

Ошибка: невозможно преобразовать значение типа "ProjectTest.Form1" в "System.Uri"

Что в таком случае делать нужно?