在运行时切换Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

时间:2010-04-15 18:05:05

标签: c# process window-style

我想切换流程在运行时的可见性,我有一个Windows窗体应用程序,它通过一个进程启动另一个控制台应用程序默认隐藏但我想允许管理员用户切换此通过复选框显示状态并显示控制台应用程序,如果他们选择。

我有这个,但它不起作用:

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;            
    }

3 个答案:

答案 0 :(得分:5)

您必须使用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 :(得分:1)

在启动进程后,不使用Process.StartInfo.WindowStyle,而是使用Process.ShowWindow()来更改窗口样式。但是,如上所述,如果您启动隐藏的过程,则永远不会显示过程窗口。恕我直言,这是一个非常烦人的错误,微软应该修复,但唉,我只是通过显示窗口然后隐藏它来解决它。不那么干净,并留下一点用户界面(或任务栏)闪烁,但至少它是有效的。

答案 2 :(得分:0)

关于该问题,一旦以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