C# 我如何知道我的应用程序是从控制台还是在C中从windows打开的#

C# 我如何知道我的应用程序是从控制台还是在C中从windows打开的#,c#,.net,winforms,console,C#,.net,Winforms,Console,我有一个既是gui又是控制台的应用程序 控制台:它从windows时间表执行,以执行一些自动化任务,因此使用参数调用它 GUI:用于输入配置参数,对于用户来说,这是一种比控制台更好的方法 所有这些都很有效。它主要是一个控制台应用程序,如果它在没有参数的情况下打开,并且显示了配置表单,则控制台是隐藏的 问题: 如果我从控制台打开它而不带任何参数,那么控制台将隐藏,表单将显示。 如何检测我打开应用程序的内容或位置,如果是从windows打开的,则隐藏控制台,如果是从控制台打开的,则保持控制台显示。我

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

控制台:它从windows时间表执行,以执行一些自动化任务,因此使用参数调用它

GUI:用于输入配置参数,对于用户来说,这是一种比控制台更好的方法

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

问题: 如果我从控制台打开它而不带任何参数,那么控制台将隐藏,表单将显示。
如何检测我打开应用程序的内容或位置,如果是从windows打开的,则隐藏控制台,如果是从控制台打开的,则保持控制台显示。

我不清楚您试图实现什么。据我所知,无论是否有参数,应用程序都将作为控制台应用程序启动。为了防止它消失,您可以使用
布尔值
来防止在用户输入配置时关闭窗口。例如(在
对话框结果中,语法可能不是100%:


如果这不能解决您需要的问题,请在您的帖子中更详细地介绍,并包含一些代码,为您的问题提供更多的定义。我无法评论和提问,所以我给出了一个基本的解决方案。如果您有任何问题,请随时提问。

一种方法是将您的cli版本和gui版本分为两个可执行文件(例如7z do和7z.exe命令行工具以及7zG gui版本)

在visual studio中可以有3个项目:

  • MyApp.Console(控制台应用程序)
  • MyApp.WindowsGui(winform/wpf应用程序)
  • MyApp.Logic(所有逻辑)
Console和WindowsGui引用了您的逻辑项目


这将为您提供更清晰的代码,因为每个“前端”项目将只处理它们的用途(处理GUI或控制台内容),并且您的逻辑可由两个前端调用

如果您确实想知道应用程序的“启动位置”,您必须知道父进程是什么。为了了解您的父进程,您可以阅读

然后,您可以检查父进程名是否为
explorer
(windows),以GUI的形式打开应用程序

基于中提供的解决方案的示例代码

名称空间控制台EAPP1
{
公共静态类ProcessExtensions
{
私有静态字符串FindIndexedProcessName(int-pid)
{
var processName=Process.GetProcessById(pid).processName;
var processesByName=Process.GetProcessesByName(processName);
字符串processIndexdName=null;
for(var index=0;index
此代码将输出:

  • 在visual studio中调试:
    devenv
  • 从windows开始:
    explorer
  • 从cmd开始:
    cmd
  • 从powershell控制台启动:
    powershell
    • 这可能有助于:

      使用系统;
      使用系统诊断;
      静态类IsRanFromConsole
      {
      私有静态只读字符串[]控制台名称={
      “cmd”、“bash”、“ash”、“dash”、“ksh”、“zsh”、“csh”,
      “tcsh”、“ch”、“eshell”、“fish”、“psh”、“pwsh”、“rc”,
      “窗扇”、“scsh”、“powershell”、“tcc”
      };
      私有静态bool-isCache=false;
      私有静态bool-isConsole;
      公共静态bool IsConsole()
      {
      如果(!isCache)
      {
      字符串parentProc=Process.GetCurrentProcess().Parent().ProcessName;
      isConsole=Array.IndexOf(consoleNames,parentProc)>-1;
      }
      返回isConsole;
      }
      }
      
      用法:

      Console.WriteLine(IsRanFromConsole.IsConsole());
      

      对于
      .Parent()
      函数,您需要添加。

      可能只是将其默认设置为console模式&需要一个参数来打开GUI,您可以为此创建一个快捷方式供用户使用。如果看不到这一点,您可以检查正在运行的进程并找到所需的进程,然后根据需要应用操作。@magiva它是否完全回答了您的问题?如果没有,请告诉我你需要什么,或者为什么这个答案不完整,我会努力让它变得更好。如果它确实回答了您的问题,您能将您的问题标记为已回答吗?这是一个完美的解决方案,可以很好地完成此任务。现在,我的控制台应用程序将隐藏控制台,如果它从资源管理器打开,控制台在所有其他类型下保持打开状态,完美。非常感谢Indeed我能理解这个问题看起来很奇怪,但它是这样工作的。它可以从cmd调用,没有参数,我不想在那个时候隐藏控制台,或者事实上我想在它关闭时重新显示它如果我从windows打开,那么它只会隐藏控制台,控制台是我需要的副产品
      using System;
      using System.Windows.Forms;
      
      // Allows you to access the static objects of Console
      //     without having to repeatedly type Console.Something.
      using static System.Console;
      
      static bool configured = false;
      static bool showForm = false;
      static void Main(string[] args) {
          showForm = args.Length < 1;
          if (showForm) {
              WriteLine("The application needs to be configured.");
              using (ConfigForm config = new ConfigForm()) {
                  if (config.ShowDialog() == DialogResult.OK) {
                      showForm = false;
                      configured = true;
                      // Set your configured arguments here.
                  }
              }
          }
      
          // Prevents the console from closing.
          while (showForm)
              ReadKey();
      
          // Do your processing in this condition.
          if (!showForm && configured)
              WriteLine("Thanks for playing. Press any key to exit.");
          else // Retry or exit in this one.
              WriteLine("An error occurred. Press any key to exit.");
      
          ReadKey();
      }
      
      using System.Runtime.InteropServices;
      
      [DllImport("kernel32.dll")]
      static extern IntPtr GetConsoleWindow();
      
      [DllImport("user32.dll")]
      static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
      
      const int SW_HIDE = 0;
      const int SW_SHOW = 5;
      
      var handle = GetConsoleWindow();
      
      // Hide
      ShowWindow(handle, SW_HIDE);
      
      // Show
      ShowWindow(handle, SW_SHOW);
      
      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();
              }
          }
      }