Открытие внешнего EXE файла на Delphi и управление его окном через C
При работе с внешними приложениями, написанными на Delphi, может возникнуть проблема двойного открытия окон. Это связано с особенностями работы с окнами в разных процессах. В данной статье мы рассмотрим, как правильно запустить внешнее приложение на Delphi, вывести его окно на передний план и разместить в заданной локации экрана.
Проблема и её решение
Пользователь столкнулся с проблемой, что при попытке запустить внешнее приложение, написанное на Delphi, через код на C#, окно приложения открывалось дважды. Одно окно отображалось корректно, но не в заданной локации, второе - без элементов управления и интерфейса, с черным фоном. Закрытие приложения приводило к исчезновению второго окна, а первое оставалось открытым.
Для решения этой проблемы необходимо использовать другой подход к поиску и управлению окном внешнего приложения. Важно найти окно приложения и управлять им, не пытаясь установить его в качестве родительского для текущего процесса.
Пример класса для управления окном
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
namespace MoveWindowTest
{
public class Helper
{
// Описание структур и перечислений для работы с окнами
// ...
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
// Остальные методы класса
// ...
}
public static void StartProcess(string fullyQualifiedExeFilename, string windowTitle, int monitorNumber, int x, int y)
{
// Запуск процесса и ожидание создания окна
// ...
// Перемещение окна на указанный монитор и координаты
MoveWindowToMonitor(hwnd, monitorNumber, x, y);
}
}
Важные моменты
Используйте psi.CreateNoWindow = true; для запуска приложения без создания окна оболочки.
Установите psi.WindowStyle = ProcessWindowStyle.Hidden; для скрытия окна при запуске.
Используйте psi.UseShellExecute = false; для более тонкого контроля над процессом.
После запуска приложения, дождитесь создания его окна, используя цикл с задержкой.
Найдите окно приложения по его заголовку, используя FindWindow.
Переместите окно на нужный монитор и в заданную позицию, используя SetWindowPos.
Пример использования класса Helper
Helper.StartProcess(filename, "UT512/UT513 Interface Program V2.00", 1, 100, 200);
Заключение
При работе с внешними приложениями, особенно на Delphi, важно правильно управлять процессами и окнами. Следуя рекомендациям из этой статьи, вы сможете избежать двойного открытия окон и управлять ими на экране.
Статья описывает проблему двойного открытия окон внешнего приложения на Delphi при попытке управления его окном через C# и предлагает решения для корректного запуска и управления окном приложения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS