[英]How to be dynamically either console application or Windows Application
我有一个小应用程序,应该以两种模式执行:非UI或WPF窗口。 它应该依赖于命令行参数。
在每种模式中,我都需要显示一些反馈日志:
我已经找到:
而且我知道我可以在项目属性中静态选择“Windows应用程序”或“控制台应用程序”。
选择“Windows应用程序”,GetConsoleWindow()始终为0,我看不到如何重用以前的控制台。
选择“控制台应用程序”,我可以重用以前的控制台,但是当在WPF窗口模式下从资源管理器启动时,会在我的WPF主窗口下创建一个控制台。
问题是: 应用程序如何真正动态? 在WPF窗口模式下,只有一个WPF窗口(根本没有控制台)或非UI,只有一个控制台(启动一个或新创建的控制台)。
在Winforms中它更容易,但它并不太难。
从WPF应用程序项目开始(不是具有WPF窗口的控制台应用程序项目)。
在根目录中创建一个新的Program.cs类,添加以下代码:
class Program
{
[DllImport("Kernel32")]
public static extern void AllocConsole();
[DllImport("Kernel32")]
public static extern void FreeConsole();
[DllImport("kernel32.dll")]
static extern bool AttachConsole(uint dwProcessId);
[STAThread]
public static void Main(string[] args)
{
bool madeConsole = false;
if (args.Length > 0 && args[0] == "console")
{
if (!AttachToConsole())
{
AllocConsole();
Console.WriteLine("Had to create a console");
madeConsole = true;
}
Console.WriteLine("Now I'm a console app!");
Console.WriteLine("Press any key to exit");
Console.ReadKey(true);
if (madeConsole)
FreeConsole();
}
else
{
WpfApplication1.App.Main();
}
}
public static bool AttachToConsole()
{
const uint ParentProcess = 0xFFFFFFFF;
if (!AttachConsole(ParentProcess))
return false;
Console.Clear();
Console.WriteLine("Attached to console!");
return true;
}
}
现在您有一个控制台应用程序或WPF应用程序。 在“属性”中,将启动对象设置为Program.Main
方法。 在上面的示例中,WpfApplication1.App.Main是旧的启动对象(在App.xaml.cs文件中定义)。
编辑这个错过了关于使用现有控制台的一个要求,一旦我弄清楚如何保持在同一个控制台窗口,我就会编辑它。
New Edit Now可以使用现有的控制台!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.