【问题标题】:How to determine whether an console application started from within a console window? [duplicate]如何确定控制台应用程序是否从控制台窗口内启动? [复制]
【发布时间】:2016-03-28 22:23:19
【问题描述】:

我有一个输出单行的小控制台应用程序。当我从控制台实例中运行程序时,我能够看到结果,因为命令提示在程序完成后重新出现。但是,当我从“运行”窗口 ([Win]+[R]) 启动程序时,控制台窗口会立即消失(因为我没有建立中断并且我不想建立中断,除非它是'不是由命令行启动的)。

那么如何确定程序是从命令行启动还是直接启动呢?

【问题讨论】:

  • 您可以将Console.ReadLine(); 放在程序的末尾,这样无论它是如何运行的,您都可以读取输出。它会暂停程序,直到您再按一次 Enter。
  • 当您从命令行启动它时,这是不必要且烦人的
  • 试试看this SO Question

标签: c# .net console-application


【解决方案1】:

我认为没有内置的方法可以找出这一点。但是我认为您可以look up the parent process 并将其用作相当好的启发式方法。快速测试表明,从运行 (Win+R) 或双击启动时,父进程是“资源管理器”。除了在 VS 中调试时,它可能在任何其他时间都是 cmd 或 powershell,然后 devenv 将是父进程。显然,如果存在其他工具将启动进程实例的情况,您可能需要提供命令行参数以强制执行特定行为。

你的代码看起来像这样:

// Note: Adapted from Hans Passant's answer linked above.
private static string GetParentProcessName() 
{
    var myId = Process.GetCurrentProcess().Id;
    var query = string.Format("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {0}", myId);
    var search = new ManagementObjectSearcher("root\\CIMV2", query);
    var queryObj = search.Get().OfType<ManagementBaseObject>().FirstOrDefault();
    if (queryObj == null)
    {
        return null;
    }
    var parentId = (uint)queryObj["ParentProcessId"];
    var parent = Process.GetProcessById((int)parentId);
    return parent.ProcessName;
}

static void Main() 
{
    /*
       Program code here.
    */
    if (string.Equals(GetParentProcessName(), "explorer", StringComparison.InvariantCultureIgnoreCase)) 
    {
        Console.ReadLine();
    }
}

【讨论】:

  • 这正是我正在寻找的,但我正在使用 !...,"cmd",... 来匹配除 cmd 之外的任何内容。非常感谢
【解决方案2】:

我认为没有任何方法可以以编程方式确定控制台应用程序的启动方式。

如果您希望应用程序在这些不同情况下表现不同,那么我建议使用参数,例如

MyApp.exe /keepopen

代码:

static int Main(string[] args)
{
    // Test if argument was supplied:
    if (args.Any(a => a == "/keepopen"))
    {
        System.Console.ReadLine();
    }
}

如果您希望控制台在从 Visual Studio 运行时保持打开状态,我相信您可以使用 Ctrl-F5 启动而无需调试。

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 2022-01-14
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多