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

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;            
    }
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”的方式启动时,这种方法将不起作用,因为窗口不会被创建,主窗口的句柄将为零(无效)。所以,也许你可以正常启动进程,然后再隐藏它。 :)

不,这个进程在 Windows 应用程序的整个生命周期中都会持续运行,可能长达数周或数月。当我查看任务管理器时,它肯定是存在并正在运行。 - m3ntat
你说得对。实际上,无论是否有控制台,一旦进程启动,它就不起作用了。我已经编辑了代码。你必须使用Windows API. :) - Nayan
更多关于 ShowWindow 的信息,请访问此处:http://www.pinvoke.net/default.aspx/user32/ShowWindow.html - Nayan

1

不要在进程启动后使用Process.StartInfo.WindowStyle,而是使用Process.ShowWindow()来更改窗口样式。然而,如上所述,如果您隐藏了进程,则永远无法显示进程窗口。在我看来,这是一个非常令人恼火的错误,微软应该修复它,但遗憾的是,我只能通过先显示窗口然后隐藏它来解决它。这不太干净,会留下一些用户界面(或任务栏)闪烁,但至少它可以工作。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接