Программное нажатие на кнопку окна сторонней программы - C#

Узнай цену своей работы

Формулировка задачи:

У себя в коде запускаю 3dsMax (через Process.Start()) на выполнение скрипта, в процессе работы всплывает предупреждение в виде MessageBox с кнопкой ОК, нажатие на которую продолжает работу скрипта. По завершению работы скрипт закрывает 3dsMax и дальше выполняется мой код, ибо WaitForExit(). Кнопка OK у окна с предупреждением имеет фокус по умолчанию и закрывается при нажатии на Enter. На данный момент для автоматического пропуска окна с предупреждением я использую подручный предмет для зажатия кнопки на клавиатуре. Более лаконичным решением я вижу создание и запуск нового потока непосредственно перед запуском 3dsMax.exe в котором будет отслеживаться окно с заголовком "Degenerate Faces" и если такое есть "кликать" кнопку ОК. По завершении работы процесса, завершается этот поток. Вопрос, как найти нужное мне окно и нажать на ОК программно? Будет ли это работать на отдельном виртуальном рабочем столе в Windows 10, чтобы я параллельно мог работать на другом?

Решение задачи: «Программное нажатие на кнопку окна сторонней программы»

textual
Листинг программы
  1.         [DllImport("user32.dll", SetLastError = true)]
  2.         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  3.  
  4.         [DllImport("user32.dll")]
  5.         static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
  6.  
  7.         const uint WM_CLOSE = 0x0010;
  8.  
  9.         public void Run()
  10.         {
  11.             bool export = maxScriptFileName.EndsWith("Export.ms");
  12.             string arguments = $"-q {(export ? "-ma" : "-mi")} -U MAXScript {maxScriptFileName}";
  13.             WriteLine($">>> Run 3dsMax to executing '{maxScriptFileName}' script in {(export ? "maximized" : "minimized")} mode . . .");
  14.  
  15.             if (export)
  16.             {
  17.                 var thread = new Thread(CloseDegenrateFacesWindow);
  18.                 thread.Start();
  19.                 Process.Start(maxExeFileName, arguments).WaitForExit();
  20.                 thread.Abort();
  21.             }
  22.             else
  23.                 Process.Start(maxExeFileName, arguments).WaitForExit();
  24.         }
  25.  
  26.         private void CloseDegenrateFacesWindow()
  27.         {
  28.             while (true)
  29.             {
  30.                 IntPtr hWnd = FindWindow(null, "Degenerate Faces");
  31.                 if (hWnd != IntPtr.Zero)
  32.                     SendMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
  33.  
  34.                 Thread.Sleep(100);
  35.             }
  36.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут