首页 > 解决方案 > 我如何知道我的应用程序是从 C# 中的控制台还是窗口打开的

问题描述

我有一个既是 gui 又是控制台的应用程序。

控制台:它从 Windows 计划执行以执行一些自动化任务,因此它使用参数调用

GUI:用于输入配置参数,用户执行此操作的方式比控制台好得多。

这一切都很好。它主要是一个控制台应用程序,如果在没有参数的情况下打开控制台并显示配置表单,则控制台将被隐藏。

问题: 如果我从没有参数的控制台打开它,控制台将被隐藏并显示表单。我如何检测我打开应用程序的内容或位置,如果它是从 Windows 打开的,则隐藏控制台,如果它是从控制台打开的,则显示控制台。

标签: c#.netwinformsconsole

解决方案


如果你真的想知道你的应用程序是从哪里开始的,你必须知道你的父进程是什么。为了了解您的父进程,您可以阅读如何以托管方式在 .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
  • ...

推荐阅读