我想在运行时切换进程的可见性,我有一个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;
}
您必须为此使用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