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

问题描述 投票:3回答:3

我想在运行时切换进程的可见性,我有一个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;            
    }
c# process window-style
3个回答
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
投票

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


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
© www.soinside.com 2019 - 2024. All rights reserved.