2015-04-29 94 views
3

我誰應該兩種模式執行的小應用程序:非UI或WPF窗口。它應該取決於命令行參數。如何動態地或者控制檯應用程序或Windows應用程序

在每種模式下,我需要顯示一些反饋日誌:

  1. 在WPF窗口模式下,WPF是要採取可視化日誌的照顧,
  2. 在沒有用戶界面模式,我需要一個控制檯顯示日誌。如果我的應用程序是從一個控制檯(主要是cmd.exe)啓動的,我想在不打開一個新的應用程序的情況下使用它。如果我的應用程序已經在控制檯之外啓動(雙擊explorer,CreateProcess,...),我需要創建一個新控制檯來輸出結果並等待一個Readkey關閉它。

我發現:

我知道我可以靜態選擇項目屬性中的「Windows應用程序」或「控制檯應用程序」。

選擇「Windows應用程序」,GetConsoleWindow()始終爲0,我看不出如何重用以前的控制檯。

選擇「控制檯應用程序」,我可以重用以前的控制檯,但是從資源管理器中的WPF窗口模式下啓動時,我的WPF主窗口下創建一個控制檯。

的問題是:應用程序如何能真正的動態?在WPF窗口模式下,只有一個WPF窗口(並且根本沒有控制檯)或在非UI中,只有一個控制檯(啓動一個或新創建的一個)。

+0

我認爲它與WPF無關,但只在PE頭和main/winmain中植入子系統。 – MuiBienCarlota

回答

7

在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文件中定義)。

編輯這個錯過你如何使用現有的控制檯,我會當我弄清楚如何留在同一個控制檯窗口中編輯的要求之一。

新編輯現在可以使用現有的控制檯!

+0

我已經試驗過這個解決方案。**你在這種情況下:「選擇控制檯應用程序」**。我們可以重用以前的控制檯,但是當從資源管理器啓動時,會在WPF主窗口下創建一個控制檯。 – MuiBienCarlota

+0

@MuiBienCarlota我建議你嘗試我所做的,當從Windows資源管理器啓動時,你沒有控制檯窗口。我在發佈之前進行了多次測試,沒有出現窗口。您可能會對項目類型感到困惑,這是一個WPF應用程序,而不是控制檯應用程序,所以在創建項目時不要選擇控制檯應用程序。 –

+0

我在你的第一個代碼上做了它,我只是嘗試了你的最後一個代碼。從WPF項目開始,將您的Program類添加爲新的主類,並將「啓動對象」更改爲主函數,將輸出類型更改爲「控制檯應用程序」。我的程序從資源管理器啓動時創建了一個控制檯。 – MuiBienCarlota

相關問題