Svi*_*ish 8 c# windows console-application
我有一个简单的应用程序,我希望通过交换机自动化.但是,当我通过开关运行它时,我真的不希望显示用户界面.我只是想让它运行,做它的工作,在控制台中打印出东西,然后退出.另一方面,如果我不使用任何开关运行它,我希望弹出用户界面.在这种情况下,我真的不希望在后台闲置一个控制台窗口.
有什么方法可以做到这一点,还是我必须创建两个单独的项目,一个控制台应用程序和一个Windows应用程序?
adr*_*nks 11
虽然不完全是你所问的,但我过去通过使用FreeConsole pInvoke删除控制台窗口来实现这种行为的外观.
您将项目的输出类型设置为控制台应用程序.然后,您可以定义extern调用FreeConsole
:
[DllImport("kernel32.dll", SetLastError=true)]
private static extern int FreeConsole();
Run Code Online (Sandbox Code Playgroud)
然后,在您的Main
方法中,您可以根据您的条件进行切换.如果您需要UI,请FreeConsole
在打开表单之前调用以清除控制台窗口.
if (asWinForms)
{
FreeConsole();
Application.Run(new MainForm());
}
else
{
// console logic here
}
Run Code Online (Sandbox Code Playgroud)
控制台窗口在启动时会短暂出现,但在我的情况下可以接受.
虽然这有点黑客并且有难闻的气味,所以我会认真考虑你是否想沿着这条路走下去.
当然,根据命令行中传递的参数,只需在静态main(string [] args)中放置一个switch语句(或if else构造).我这样做也可以在执行服务或控制台之间切换......
注意:将项目类型设置为Console App
[DllImport("kernel32.dll", SetLastError=true)]
private static extern int FreeConsole();
[STAThread]
static void Main(string[] args)
{
if (args.Length == 0 && args[0] == "C") // Console
{
// Run as console code
Console.WriteLine("Running as Console App");
Console.WriteLine("Hit any Key to exit");
Console.ReadLine();
}
else
{
//Console.SetWindowSize(1,1);
//string procName = Assembly.GetExecutingAssembly().FullName;
//ProcessStartInfo info = new ProcessStartInfo(procName );
//info.WindowStyle = ProcessWindowStyle.Minimized;
// EDIT: Thanks to Adrian Bank's answer -
// a better approach is to use FreeConsole()
FreeConsole();
Application.Run(new MyForm());
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:感谢Adrian Bank的回答,FreeConsole()是一个更好的方法来"分配"控制台窗口而不是最小化它...