代码之家  ›  专栏  ›  技术社区  ›  Matt

如何在应用程序仍在运行时阻止控制台返回附加到控制台的WPF应用程序

  •  0
  • Matt  · 技术社区  · 6 年前

    我在WPF入口点有以下代码

    public partial class App : Application
    {
        [DllImport("kernel32.dll")]
        static extern bool AttachConsole(int dwProcessId);
        private const int ATTACH_PARENT_PROCESS = -1;
    
        protected override void OnStartup(StartupEventArgs e)
        {
            if (e.Args.Length == 0)
            {
                // Launch GUI and pass arguments in case you want to use them.
                base.OnStartup(e);
                new MainWindow().ShowDialog();
            }
            else
            {
                //Do command line stuff
                if (e.Args.Contains("-i"))
                {
                    // redirect console output to parent process;
                    // must be before any calls to Console.WriteLine()
                    AttachConsole(ATTACH_PARENT_PROCESS);
                    var stopWatch = new Stopwatch();
                    stopWatch.Reset();
                    stopWatch.Start();
    
                    for (int i = 0; i < 100; i++)
                    {
                        Console.WriteLine(i);
                    }
                    stopWatch.Stop();
                    var ts = stopWatch.Elapsed;
                    var elapsedTime = $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}.{ts.Milliseconds / 10:00}";
                    Console.WriteLine("RunTime " + elapsedTime);               
                }
                else
                {
                    AttachConsole(ATTACH_PARENT_PROCESS);
                    Console.WriteLine("Incorrect arguments");
                }
            }
    
            Shutdown();
        }
    }
    

    提示立即返回,就像我的应用程序在后台运行一样。

    enter image description here

    我希望应用程序能够阻止控制台返回,直到过程完成。

    1 回复  |  直到 6 年前
        1
  •  1
  •   vendettamit    6 年前

    这个 AttachConsole 重新使用现有控制台 AllocConsole() 相反。除非父进程正在运行,否则这将阻塞控制台,并在程序完成执行后立即关闭控制台。

    [DllImport("kernel32.dll")]
    static extern bool AllocConsole();