首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

讓 WPF 應用程式支援命令列模式運行的三種方案

     編輯:關於.NET

問題背景

有時希望 WPF 視窗程式也能接受命令列參數、以 Console 方式輸出資訊。但在 Window 的 Loaded 事件中寫 Console.WriteLine("Hello world."),從 CMD 執行卻完全沒輸出(見圖一)。

圖一:從命令列運行 WPF 程式,Console 輸出無聲無息

方案一:使用 more 重導向(零程式碼修改)

執行時加上 | more 即可看到輸出(見圖二)。

圖二:使用 more 重導向輸出

  • 優點:完全不需修改程式碼、重新編譯。
  • 缺點:需使用者記得加參數;輸出會分頁,不適合自動化腳本。

方案二:將 Output Type 改為 Console Application

VS 專案屬性 → Application 分頁 → Output Type 改為 Console Application(見圖三)。

圖三:Output Type 改為 Console Application 的效果

  • 優點:原生支援 Console 輸入輸出,行為最自然。
  • 缺點:無論以何種方式啟動,都會多出一個 Console 視窗,GUI 體驗大打折扣。

方案三:Windows API AttachConsole 動態關聯(推薦)

呼叫 kernel32.dll 的 AttachConsole,將 WPF 進程與父進程的 Console 關聯(見圖四)。

圖四:Attach Console 效果

ConsoleAttacher 完整實作

using System.Runtime.InteropServices;

namespace WpfConsole
{
    /// 
    /// 主控台附加工具
    /// 
    public static class ConsoleAttacher
    {
        private const int ATTACH_PARENT_PROCESS = -1;

        /// 
        /// 附加到父進程的主控台
        /// 
        public static void AttachParentConsole()
        {
            AttachConsole(ATTACH_PARENT_PROCESS);
        }

        [DllImport("Kernel32.dll", EntryPoint = "AttachConsole", CharSet = CharSet.Unicode, SetLastError = true)]
        public static extern void AttachConsole(int dwProcessId);
    }
}

在 WPF 中呼叫

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    ConsoleAttacher.AttachParentConsole();
    Console.WriteLine("Hello world."); // 現在能正常輸出了
}

三方案比較總結

方案優點缺點適用場景
| more零修改、零部署需手動加參數、分頁輸出臨時除錯、一次性查看
Output Type = Console原生支援、功能最全永遠多一個黑框視窗純 CLI 工具、或同時需 GUI/CLI 且不介意黑框
AttachConsole (API)按需附加、GUI 模式無黑框、CLI 模式正常輸出需 P/Invoke、僅限 Windows**最推薦**:雙模式應用、生產環境部署

進階提示

  • 若需同時支援「雙擊執行 GUI」與「命令列帶參數輸出」,建議在 Main 入口點根據 Environment.GetCommandLineArgs() 判斷是否附加 Console。
  • AttachConsole 若失敗(如非從 Console 啟動),會靜默失敗,不拋例外,安全無虞。
  • 搭配 FreeConsole() 可在需要時主動脫離 Console。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved