我想开发一种方法,当通过正在运行的应用程序调用它时,它应该打印一个列表,但是当直接通过命令行调用该方法时,我希望它将相同的列表打印到一个 txt 文件。
你们知道我如何执行此验证,或者是否有一种方法可以检测从何处调用进程?
我在 stak overflow 上找到了这篇文章,但我不知道如何解决我的问题。
最佳答案
您可以尝试从内核 32 函数调用中获取控制台窗口。
private const string Kernel32_DllName = "kernel32.dll";
[DllImport(Kernel32_DllName)]
private static extern IntPtr GetConsoleWindow();
public static bool HasConsole {
get { return GetConsoleWindow() != IntPtr.Zero; }
}
如果加载了控制台,HasConsole 应返回 true,如果从窗口启动则返回 false。
如果程序是控制台应用程序,总会有一个控制台窗口打开,因此检测启动方法比较棘手。
已经有一个涵盖此问题的 SO 问题 - How can you determine how a console application was launched?
作为快速引用,下面列出了相关部分,但我建议通读该主题,因为它更清楚地解释了该过程。
static bool StartedFromGui =
!Console.IsOutputRedirected
&& !Console.IsInputRedirected
&& !Console.IsErrorRedirected
&& Environment.UserInteractive
&& Environment.CurrentDirectory == System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)
&& Console.CursorTop == 0 && Console.CursorLeft == 0
&& Console.Title == Environment.GetCommandLineArgs()[0]
&& Environment.GetCommandLineArgs()[0] == System.Reflection.Assembly.GetEntryAssembly().Location;
关于具有两种不同行为的 C# 方法是通过正在运行的应用程序或命令行调用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31875323/