Активация главного окна AutoCAD и перевести на передний план в Windows

Автор Тема: Активация главного окна AutoCAD и перевести на передний план в Windows  (Прочитано 3620 раз)

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Всем добрый вечер,
Есть ли способ сделать активным и перевести окно AutoCAD на передний план среди окон Windows?
Тестовый пример, в котором каждые 3 секунды запускается команда, в которой нужно активировать окно автокада.
       
Код - C# [Выбрать]
  1.         [CommandMethod(nameof(TestMainWindow), CommandFlags.Modal)]
  2.         public static void TestMainWindow()
  3.         {
  4.             var timer = new Timer(3000);
  5.             timer.Elapsed += (s, e) =>
  6.               Application.DocumentManager.MdiActiveDocument.SendStringToExecute(
  7.                   $"{nameof(TestActivateMainWindow)} ", true, false, true);
  8.             timer.Start();
  9.         }
  10.  
  11.         [CommandMethod(nameof(TestActivateMainWindow), CommandFlags.Modal)]
  12.         public static void TestActivateMainWindow()
  13.         {
  14.             SetForegroundWindow();
  15.         }
  16.  
  17.         private static void SetForegroundWindow()
  18.         {
  19.             Debug.WriteLine("SetForegroundWindow");
  20.             Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView();
  21.             if (Application.MainWindow.WindowState == Window.State.Minimized)
  22.             {
  23.                 Application.MainWindow.WindowState = Window.State.Maximized;
  24.             }
  25.             Application.MainWindow.Focus();
  26.             //var prc = Process.GetCurrentProcess();
  27.             //SetForegroundWindow(prc.MainWindowHandle);
  28.         }
Запускать командой TestMainWindow.
Пробую разные способы. Но результата нет.
Нужно, чтобы окно автокада стало на переднем плане в винде.

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Есть дурной способ:
Код - C# [Выбрать]
  1.             Application.MainWindow.WindowState = Window.State.Minimized;
  2.             Application.MainWindow.WindowState = Window.State.Maximized;
Работает. Но, не очень хорошо, всегда изменять размер окна, т.е. всегда его Maximized делать.

Отмечено как Решение Вильдар 17-05-2018, 09:41:13

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вильдар
Думаю, что тут нужно пойти путём Win32 API (не тестировал):
Код - C# [Выбрать]
  1. [DllImport("user32.dll")]
  2. private static extern bool SetForegroundWindow(IntPtr hWnd);
  3. public static void ActivateAutoCADMainWindow()
  4. {
  5.  Process acadProcess = Process.GetCurrentProcess();
  6.  SetForegroundWindow(acadProcess.MainWindowHandle);
  7. }

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Альтернатива:
Код - C# [Выбрать]
  1. [DllImport("User32.dll", SetLastError = true)]
  2. static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
Описание этой функции: https://msdn.microsoft.com/en-us/library/windows/desktop/ms633553(v=vs.85).aspx
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Но вообще все эти методы - это хак. Уже давным давно Microsoft активно "не приветствует" программное переключение приложений на передний план - только самим пользователем. Так что если это и работает в какой-то из версий Windows, то при очередном обновлении может перестать работать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Александр Ривилис,  спасибо, попробую.
Нужно передавать данные между двумя программами, и чтобы окна активировались. Иначе не очень удобно.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр Ривилис,  спасибо, попробую.
И как? Получилось?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Пока использую Ответ 2 SetForegroundWindow для MainWindowHandle.
У меня работает.
Понаблюдаю на разных компах.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
А команда Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView() не переведет фокус на автокад?

Еще вот нашел интересное решение без WinApi - http://adndevblog.typepad.com/autocad/2013/03/use-of-windowfocus-in-autocad-2014.html

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр Пекшев aka Modis,
Ты путаешь переключение фокуса/активного окна внутри одного процесса и между всеми запущенными процессами.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр Пекшев aka Modis,
Ты путаешь переключение фокуса/активного окна внутри одного процесса и между всеми запущенными процессами.
Да, точно. Тогда только WinApi. Хотя мои примеры тоже могут быть полезны, так как помимо перевода фокуса на автокад еще обязательно потребуется "активировать" его редактор ("ткнуть в пространство модели")