[英]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.