Переключить Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden во время выполнения
Я хочу переключить видимость процесса во время выполнения, у меня есть приложение 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 ответа
Вы должны использовать 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
потому что окно не будет создано и дескриптор главного окна будет нулевым (недействительным).
Так что, может быть, вы можете запустить процесс как обычно, а затем скрыть его после этого.:)
Вместо использования Process.StartInfo.WindowStyle после запуска процесса вы используете Process.ShowWindow() для изменения стиля окна. Однако, как указано выше, если вы запустите процесс скрытно, вы никогда не сможете отобразить окно процесса. ИМХО, это очень досадная ошибка, которую Microsoft должна исправить, но, увы, я просто обхожу ее, показывая окно, а затем скрывая его. Не так чисто, и оставляет небольшой пользовательский интерфейс (или панель задач) мигает, но, по крайней мере, это работает.
Что касается проблемы, то, когда процесс запускается как hidden
невозможно показать окно консоли.
У меня это работает, когда я дважды вызываю команду showWindow.
В первый раз ничего не происходит. Второй раз появляется окно скрытого процесса.
Может кто подтвердит?
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
...
...
...
ShowWindow(handle, 5); //nothing happens
ShowWindow(handle, 5); //console window appears