Запустить невидимый процесс (CreateNoWindow & WindowStyle не работает?) - PullRequest
13 голосов
/ 10 июня 2010

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

Я хочу Работникаприложение для запускается полностью скрытым (кроме отображения в диспетчере задач, конечно).Я думал, что смогу сделать это с помощью свойств 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 запустился, но не появился?

Ответы [ 3 ]

7 голосов
/ 10 июня 2010

Использование 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);
}
5 голосов
/ 10 июня 2010

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

0 голосов
/ 27 июня 2014

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

...