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