3

我想在运行时切换进程的可见性,我有一个 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;            
    }
4

3 回答 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,因为不会创建窗口并且主窗口的句柄将为零(无效)。
因此,也许您可​​以正常启动该过程,然后将其隐藏。:)

于 2010-04-15T18:35:06.403 回答
1

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

于 2011-10-28T19:22:40.090 回答
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
于 2020-01-27T08:45:52.723 回答