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

ADN Club => AutoCAD .NET API => Тема начата: Вильдар от 15-05-2018, 21:13:40

Название: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Вильдар от 15-05-2018, 21:13:40
Всем добрый вечер,
Есть ли способ сделать активным и перевести окно 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.
Пробую разные способы. Но результата нет.
Нужно, чтобы окно автокада стало на переднем плане в винде.

Срабатывает пока, только, если свернуть окно автокада.
Название: Re: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Вильдар от 15-05-2018, 21:24:27
Есть дурной способ:
Код - C# [Выбрать]
  1.             Application.MainWindow.WindowState = Window.State.Minimized;
  2.             Application.MainWindow.WindowState = Window.State.Maximized;
Работает. Но, не очень хорошо, всегда изменять размер окна, т.е. всегда его Maximized делать.
Название: Re: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Александр Ривилис от 15-05-2018, 21:44:20
Вильдар
Думаю, что тут нужно пойти путём 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
Название: Re: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Александр Ривилис от 15-05-2018, 21:58:11
Альтернатива:
Код - 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
Название: Re: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Александр Ривилис от 15-05-2018, 22:17:18
Но вообще все эти методы - это хак. Уже давным давно Microsoft активно "не приветствует" программное переключение приложений на передний план - только самим пользователем. Так что если это и работает в какой-то из версий Windows, то при очередном обновлении может перестать работать.
Название: Re: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Вильдар от 15-05-2018, 22:42:42
Александр Ривилис,  спасибо, попробую.
Нужно передавать данные между двумя программами, и чтобы окна активировались. Иначе не очень удобно.
Название: Re: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Александр Ривилис от 16-05-2018, 21:26:19
Александр Ривилис,  спасибо, попробую.
И как? Получилось?
Название: Re: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Вильдар от 17-05-2018, 08:39:48
Пока использую Ответ 2 SetForegroundWindow для MainWindowHandle.
У меня работает.
Понаблюдаю на разных компах.
Название: Re: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Александр Пекшев aka Modis от 20-05-2018, 01:07:19
А команда Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView() не переведет фокус на автокад?

Еще вот нашел интересное решение без WinApi - http://adndevblog.typepad.com/autocad/2013/03/use-of-windowfocus-in-autocad-2014.html
Название: Re: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Александр Ривилис от 20-05-2018, 01:16:02
Александр Пекшев aka Modis,
Ты путаешь переключение фокуса/активного окна внутри одного процесса и между всеми запущенными процессами.
Название: Re: Активация главного окна AutoCAD и перевести на передний план в Windows
Отправлено: Александр Пекшев aka Modis от 20-05-2018, 01:24:35
Александр Пекшев aka Modis,
Ты путаешь переключение фокуса/активного окна внутри одного процесса и между всеми запущенными процессами.
Да, точно. Тогда только WinApi. Хотя мои примеры тоже могут быть полезны, так как помимо перевода фокуса на автокад еще обязательно потребуется "активировать" его редактор ("ткнуть в пространство модели")