簡體   English   中英

如何動態控制台應用程序或Windows應用程序

[英]How to be dynamically either console application or Windows Application

我有一個小應用程序,應該以兩種模式執行:非UI或WPF窗口。 它應該依賴於命令行參數。

在每種模式中,我都需要顯示一些反饋日志:

  1. 在WPF窗口模式下,WPF將負責可視化日志,
  2. 在沒有UI模式下,我需要一個控制台來顯示日志。 如果我的應用程序是從控制台(主要是cmd.exe)啟動的,我想在不打開新的應用程序的情況下使用它。 如果我的應用程序已在控制台外啟動(雙擊資源管理器,CreateProcess,...),我需要創建一個新的控制台來輸出我的結果並等待Readkey關閉它。

我已經找到:

而且我知道我可以在項目屬性中靜態選擇“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM