Подтвердить что ты не робот

С# - запуск невидимого процесса (CreateNoWindow & WindowStyle не работает?)

У меня есть 2 программы (.exe), которые я создал в .NET. Мы назовем их Учителем и Рабочим. Мастер запускает 1 или более Рабочих. Работник будет не взаимодействовать с пользователем, но это приложение WinForms, которое получает команды и запускает компоненты WinForms на основе команд, которые он получает от Мастера.

Я хочу, чтобы приложение Worker было полностью запущено (за исключением, конечно, в Диспетчере задач). Я думал, что могу выполнить это с помощью свойств StartInfo.CreateNoWindow и StartInfo.WindowStyle, но я все еще вижу окно и компоненты Client.exe в форме. Однако он не отображается в панели задач.

   Process process = new Process
      {
          EnableRaisingEvents = true,
          StartInfo =
              {
                  CreateNoWindow = true,
                  WindowStyle = ProcessWindowStyle.Hidden

                  FileName = "Client.exe",
                  UseShellExecute = false,
                  ErrorDialog = false,
              }
      };

Что мне нужно сделать, чтобы запустить Client.exe, но не отображаться?

4b9b3361

Ответ 1

Ваше использование CreateNoWindow/WindowStyle отлично работает в моей системе с помощью notepad.exe(например, оно скрыто, но работает в фоновом режиме), поэтому, вероятно, это приложение WinForms. Некоторые идеи:

Вариант 1: Если вы управляете рабочим процессом WinForms, вы можете переопределить Control.SetVisibleCore, чтобы всегда скрывать форма. Если вы не хотите всегда скрывать это, вы можете передать ему аргумент командной строки, например. /hide, что приведет к его скрытию. Пример (предполагая, что для формы уже есть код):

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }

    protected override void SetVisibleCore(bool value)
    {
        // You'd probably want to parse the command line.
        if (Environment.CommandLine.Contains("/hide"))
            base.SetVisibleCore(false);
        else
            base.SetVisibleCore(value);
    }
}

При этом запуск MyForm.exe приводит к процессу с видимой формой. Выполнение MyForm.exe /hide приводит к процессу со скрытой формой. Вы можете передать аргумент /hide из своего основного процесса, чтобы обычные пользователи, запускающие приложение, все равно его увидели.

Вариант 2:. Вы можете скрыть приложение после его запуска, выполнив P/Invoke на ShowWindow, Подробнее об этом здесь. Это имеет недостаток, что вы можете иногда видеть мерцание рабочего окна до его скрытия. Пример:

class Program
{
    public static void Main(string[] args)
    {
        ProcessStartInfo psi = new ProcessStartInfo()
        {
            FileName = @"C:\windows\system32\notepad.exe",
        };

        Process process = Process.Start(psi);

        // Wait until the process has a main window handle.
        while (process.MainWindowHandle == IntPtr.Zero)
        {
            process.Refresh();
        }

        ShowWindow(process.MainWindowHandle, SW_HIDE);
    }

    const int SW_HIDE = 0;

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}

Ответ 2

Проблема заключается в UseShellExecute = false, установите это на true, и процесс будет запущен как скрытый. Использование оболочки для запуска процесса понимает, как сделать приложение скрытым, где, когда запуск процесса непосредственно с UseShellExecute = false запускает процесс напрямую, и, как сказал Крис Шмих, вам придется обрабатывать скрытие окна из клиентского приложения, Это может быть более желательно, если вы хотите, чтобы приложение запускалось вручную для отладки или тестирования.

Ответ 3

Вам нужно добавить base.Visibility = Visibility.Hidden; в конструктор приложения Win Form.