【问题标题】:Process with ProcessWindowStyle.Hidden still shows Press any key to exit?ProcessWindowStyle.Hidden 的进程仍然显示按任意键退出?
【发布时间】:2012-02-24 12:12:52
【问题描述】:

我有这个:

        var startInfo = new ProcessStartInfo
                            {
                                FileName = _pathToExe,
                                RedirectStandardOutput = true,
                                RedirectStandardError = true,
                                RedirectStandardInput = true,
                                UseShellExecute = false,
                                WorkingDirectory = FilepathHelper.GetFolderFromFullPath(_pathToExe),
                                CreateNoWindow = true,
                                WindowStyle = ProcessWindowStyle.Hidden
                            };

        try
        {
            using (_proc = Process.Start(startInfo))
            {
                _proc.EnableRaisingEvents = true;
                _proc.ErrorDataReceived += proc_DataReceived;
                _proc.OutputDataReceived += proc_DataReceived;
                _proc.BeginErrorReadLine();
                _proc.BeginOutputReadLine();

                var myStreamWriter = _proc.StandardInput;

                var allArgs = "";
                foreach (var arg in _args)
                    allArgs += arg + Environment.NewLine;

                myStreamWriter.Write(allArgs);
                _proc.WaitForExit();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

我正在执行一个别人写的 *.exe。对于这个特定的 *.exe - 即使您可以清楚地看到上面我设置了 ProcessWindowStyle.Hidden,我仍然看到一个黑色窗口出现,上面写着“按任意键退出。”。这个 *.exe - 如果我从命令行运行(而不是从我的 C# 代码中调用它)会产生大量的控制台输出文本。当我运行我的 C# 代码时,我没有看到这个输出文本,这是我想要的,也意味着重定向正在工作。

我检查并完成了该过程 - 就好像命令窗口本身正在添加这个额外的(不受欢迎的)步骤。

以前有没有人遇到过这种情况,如果有,我该如何解决?

【问题讨论】:

  • 这不是你要找的吗? stackoverflow.com/questions/186822/…
  • 不,该链接是关于重定向的。我没有重定向的问题。还有其他链接吗??有人有办法解决这个问题。

标签: c# .net command-line console-application


【解决方案1】:

您正在启动的程序似乎在最后调用 system("PAUSE") 从而产生了一个新进程,该进程打印“按任意键继续...”消息并等待用户输入。我无法重现你的确切情况,但你可以试试这个。

        var startInfo = new ProcessStartInfo
        {
            FileName = "cmd.exe", 
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            RedirectStandardInput = true,
            UseShellExecute = false,
            CreateNoWindow = true,
        };

        try
        {
            Process _proc;
            using (_proc = Process.Start(startInfo))
            {
                _proc.EnableRaisingEvents = true;
                _proc.BeginErrorReadLine();
                _proc.BeginOutputReadLine();

                var myStreamWriter = _proc.StandardInput;

                myStreamWriter.WriteLine("D:\\your.exe"); //write your.exe to cmd and press enter :) 
                _proc.WaitForExit();

            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

【讨论】:

  • 抱歉,这不是解决方案。您通过将 FileName 切换为 cmd.exe 从根本上改变了我的问题。
  • 您可以在 myStreamWriter 的帮助下启动 cmd.exe,然后在其中运行 your.exe。这与直接运行 your.exe 相同,但在 cmd.exe 的控制台上下文中。然后,您可以等待“Press any key to continue...”字符串被读取,表明进程已完成其工作,然后关闭它。
【解决方案2】:

来自文档:

要使用 System.Diagnostics.ProcessWindowStyle.Hidden,system.Diagnostics.ProcessStartInfo.UseShellExecute 属性必须为 true。

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多