Программное нажатие на кнопку окна сторонней программы - C#
Формулировка задачи:
У себя в коде запускаю 3dsMax (через Process.Start()) на выполнение скрипта, в процессе работы всплывает предупреждение в виде MessageBox с кнопкой ОК, нажатие на которую продолжает работу скрипта. По завершению работы скрипт закрывает 3dsMax и дальше выполняется мой код, ибо WaitForExit(). Кнопка OK у окна с предупреждением имеет фокус по умолчанию и закрывается при нажатии на Enter. На данный момент для автоматического пропуска окна с предупреждением я использую подручный предмет для зажатия кнопки на клавиатуре. Более лаконичным решением я вижу создание и запуск нового потока непосредственно перед запуском 3dsMax.exe в котором будет отслеживаться окно с заголовком "Degenerate Faces" и если такое есть "кликать" кнопку ОК. По завершении работы процесса, завершается этот поток.
Вопрос, как найти нужное мне окно и нажать на ОК программно? Будет ли это работать на отдельном виртуальном рабочем столе в Windows 10, чтобы я параллельно мог работать на другом?
Решение задачи: «Программное нажатие на кнопку окна сторонней программы»
textual
Листинг программы
- [DllImport("user32.dll", SetLastError = true)]
- static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
- [DllImport("user32.dll")]
- static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
- const uint WM_CLOSE = 0x0010;
- public void Run()
- {
- bool export = maxScriptFileName.EndsWith("Export.ms");
- string arguments = $"-q {(export ? "-ma" : "-mi")} -U MAXScript {maxScriptFileName}";
- WriteLine($">>> Run 3dsMax to executing '{maxScriptFileName}' script in {(export ? "maximized" : "minimized")} mode . . .");
- if (export)
- {
- var thread = new Thread(CloseDegenrateFacesWindow);
- thread.Start();
- Process.Start(maxExeFileName, arguments).WaitForExit();
- thread.Abort();
- }
- else
- Process.Start(maxExeFileName, arguments).WaitForExit();
- }
- private void CloseDegenrateFacesWindow()
- {
- while (true)
- {
- IntPtr hWnd = FindWindow(null, "Degenerate Faces");
- if (hWnd != IntPtr.Zero)
- SendMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
- Thread.Sleep(100);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д