如何确定控制台应用程序是否从控制台窗口中启动?

时间:2016-03-28 22:23:19

标签: c# .net console-application

我有一个小的控制台应用程序,它输出一行。当我从控制台实例中运行程序时,我能够看到结果,因为命令在程序完成后会重新获得。但是,当我从" Run" -window([Win] + [R])启动程序时,控制台窗口立即消失(因为我没有内置休息,我不想除非命令行没有启动它,否则将构建一个休息时间。

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

2 个答案:

答案 0 :(得分:4)

我认为没有内置的方法可以找到它。但是我认为你可以look up the parent process使用它作为相当不错的启发式算法。快速测试表明,从Run(Win + R)或双击启动时,父进程是“资源管理器”。除了在VS中调试时,它可能是cmd或powershell,除非在VS中进行调试,然后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();
    }
}

答案 1 :(得分:1)

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

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

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启动而无需调试。