Программное нажатие на кнопку окна сторонней программы - 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);
            }
        }

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


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

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

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