我有一个小的控制台应用程序,它输出一行。当我从控制台实例中运行程序时,我能够看到结果,因为命令在程序完成后会重新获得。但是,当我从" Run" -window([Win] + [R])启动程序时,控制台窗口立即消失(因为我没有内置休息,我不想除非命令行没有启动它,否则将构建一个休息时间。
那么如何确定程序是从命令行启动还是直接启动?
答案 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启动而无需调试。