c# - 我如何知道我的应用程序是从 C# 中的控制台还是窗口打开的
问题描述
我有一个既是 gui 又是控制台的应用程序。
控制台:它从 Windows 计划执行以执行一些自动化任务,因此它使用参数调用
GUI:用于输入配置参数,用户执行此操作的方式比控制台好得多。
这一切都很好。它主要是一个控制台应用程序,如果在没有参数的情况下打开控制台并显示配置表单,则控制台将被隐藏。
问题: 如果我从没有参数的控制台打开它,控制台将被隐藏并显示表单。我如何检测我打开应用程序的内容或位置,如果它是从 Windows 打开的,则隐藏控制台,如果它是从控制台打开的,则显示控制台。
解决方案
如果你真的想知道你的应用程序是从哪里开始的,你必须知道你的父进程是什么。为了了解您的父进程,您可以阅读如何以托管方式在 .NET 中获取父进程的解决方案
然后,您可以例如检查您的父进程名称是否为explorer
(windows) 以将您的应用程序作为 GUI 打开。
基于如何以托管方式在 .NET 中获取父进程中提供的解决方案的示例代码
namespace ConsoleApp1
{
public static class ProcessExtensions
{
private static string FindIndexedProcessName(int pid)
{
var processName = Process.GetProcessById(pid).ProcessName;
var processesByName = Process.GetProcessesByName(processName);
string processIndexdName = null;
for (var index = 0; index < processesByName.Length; index++)
{
processIndexdName = index == 0 ? processName : processName + "#" + index;
var processId = new PerformanceCounter("Process", "ID Process", processIndexdName);
if ((int)processId.NextValue() == pid)
{
return processIndexdName;
}
}
return processIndexdName;
}
private static Process FindPidFromIndexedProcessName(string indexedProcessName)
{
var parentId = new PerformanceCounter("Process", "Creating Process ID", indexedProcessName);
return Process.GetProcessById((int)parentId.NextValue());
}
public static Process Parent(this Process process)
{
return FindPidFromIndexedProcessName(FindIndexedProcessName(process.Id));
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Process.GetCurrentProcess().Parent().ProcessName);
Console.ReadKey();
}
}
}
此代码将输出:
- 在视觉工作室调试:
devenv
- 从窗口开始:
explorer
- 从 cmd 开始:
cmd
- 从 powershell 控制台开始:
powershell
- ...
推荐阅读
- dojo - 如何在 jsp 表中使用 Dojo dgrid?
- sql - 日期明智的每小时(24 小时)客户计数
- android - JCenter 托管遵循 maven 约定的 java 应用程序
- git - 无法切换回当前分支之前的分支
- javascript - 如何显示所选图像及其名称?
- iframe - Vue v-html:在渲染的 iframe 中停止执行脚本
- powershell - 获取 PID 的用户名(ProcessId)
- python - ffill 不填充熊猫数据框中的数据
- reactjs - ReactJS:从 API 获取数据
- xamarin - Xamarin.iOS 中 Xamarin 组件的替代方案