Answers:
这是如何做:
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);
csproj
手动编辑文件,才有可能使您的应用程序在“调试”模式下成为控制台应用程序。Visual Studio没有GUI可以执行此操作,但是如果您csproj
正确地编辑文件,它将接受该设置。
using System.Runtime.InteropServices;
const int SW_SHOWMINIMIZED = 2;
,然后添加,ShowWindow(handle, SW_SHOWMINIMIZED);
这样控制台就不会隐藏,只是最小化了。
只需转到应用程序的属性,然后将输出类型从Console Application更改为Windows Application即可。
如果要隐藏控制台本身,为什么需要控制台应用程序?=)
我建议将项目输出类型设置为Windows应用程序而不是控制台应用程序。它不会显示控制台窗口,但会执行所有操作,例如控制台应用程序。
TopShelf
允许您将其Consoles
作为服务来运行,这打破了
您可以进行相反的操作,并将“应用程序”输出类型设置为:Windows应用程序。然后将此代码添加到应用程序的开头。
[DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();
private const int STD_OUTPUT_HANDLE = -11;
private const int MY_CODE_PAGE = 437;
private static bool showConsole = true; //Or false if you don't want to see the console
static void Main(string[] args)
{
if (showConsole)
{
AllocConsole();
IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true);
FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);
}
//Your application code
}
如果showConsole
是,此代码将显示控制台true
在这里查看我的帖子:
您可以制作Windows应用程序(有或没有窗口)并根据需要显示控制台。使用此方法,除非您明确显示控制台窗口,否则它不会出现。我将其用于双模式应用程序,这些应用程序要根据其打开方式在控制台或GUI模式下运行。
如果您不想依赖窗口标题,请使用以下命令:
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
...
IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
ShowWindow(h, 0);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormPrincipale());
如果您在集成小型批处理应用程序时没有问题,可以使用名为Cmdow.exe的程序,该程序将允许您根据控制台标题隐藏控制台窗口。
Console.Title = "MyConsole";
System.Diagnostics.Process HideConsole = new System.Diagnostics.Process();
HideConsole.StartInfo.UseShellExecute = false;
HideConsole.StartInfo.Arguments = "MyConsole /hid";
HideConsole.StartInfo.FileName = "cmdow.exe";
HideConsole.Start();
将exe添加到解决方案中,将构建操作设置为“内容”,将“复制到输出目录”设置为适合您的命令,cmdow将在运行时隐藏控制台窗口。
要再次使控制台可见,您只需更改参数
HideConsole.StartInfo.Arguments = "MyConsole /Vis";