Переключить Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden во время выполнения - PullRequest
3 голосов
/ 15 апреля 2010

Я хочу переключать видимость процесса во время выполнения , у меня есть приложение Windows Form, которое через процесс запускает другое консольное приложение, скрытое по умолчанию, но я бы хотел, чтобы пользователь-администратор мог переключать это состояние через флажок и показать консольное приложение, если они выберут.

У меня есть это, но оно не работает:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        ProcessWindowStyle state = cvarDataServiceProcess.StartInfo.WindowStyle;
        if (state == ProcessWindowStyle.Hidden)
            cvarDataServiceProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
        else if (state == ProcessWindowStyle.Normal)
            cvarDataServiceProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;            
    }

Ответы [ 2 ]

5 голосов
/ 15 апреля 2010

Для этого вы должны использовать Win32 API.

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

    ProcessWindowStyle state = ProcessWindowStyle.Normal;

    void toggle()
    {
        if (cvarDataServiceProcess.HasExited)
        {
            MessageBox.Show("terminated");
        }
        else
        {
            if (cvarDataServiceProcess.MainWindowHandle != IntPtr.Zero)
            {
                if (state == ProcessWindowStyle.Hidden)
                {
                    //normal
                    state = ProcessWindowStyle.Normal;
                    ShowWindow(cvarDataServiceProcess.MainWindowHandle, 1);
                }
                else if (state == ProcessWindowStyle.Normal)
                {
                    //hidden
                    state = ProcessWindowStyle.Hidden;
                    ShowWindow(cvarDataServiceProcess.MainWindowHandle, 0);
                }
            }
        }
    }

Это, однако, не будет работать при запуске процесса hidden, потому что окно не будет создано и дескриптор главного окна будет нулевым (недействительным).
Так что, может быть, вы можете запустить процесс как обычно, а затем скрыть его после этого. :)

1 голос
/ 28 октября 2011

Вместо использования Process.StartInfo.WindowStyle после запуска процесса вы используете Process.ShowWindow () для изменения стиля окна. Однако, как указано выше, если вы запустите процесс скрытно, вы никогда не сможете отобразить окно процесса. ИМХО, это очень досадная ошибка, которую Microsoft должна исправить, но, увы, я просто обхожу ее, показывая окно, а затем скрывая его. Не так чисто и оставляет небольшой пользовательский интерфейс (или панель задач), но, по крайней мере, работает.

...