Windows PowerShell 擁有完整的 .NET 類別庫存取能力,這意味著我們可以直接在腳本中引用 System.Windows.Forms 組件,無需 Visual Studio、無需編譯,即刻開發圖形化桌面應用程式。本文將示範如何從零開始,純手工打造一個具備文字輸入與按鈕互動的 WinForm 視窗。
PowerShell 透過反射動態載入組件,並手動管理視窗生命週期:
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")[System.Windows.Forms.Application]::EnableVisualStyles() 讓控制項擁有現代外觀。[System.Windows.Forms.Application]::Run($form) 是關鍵,直接呼叫 $form.Show() 會導致視窗一閃即逝,因為缺少訊息泵處理系統事件。以下程式碼展示完整建構流程,包含表單實例化、流式版面配置、文字方塊、按鈕建立與事件綁定:
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$app = [System.Windows.Forms.Application]
$myForm = New-Object System.Windows.Forms.Form
$myForm.Text = "PowerShell WinForm Demo"
# 建立按鈕
$button1 = New-Object System.Windows.Forms.Button
$button1.Size = New-Object System.Drawing.Size(75, 23)
$button1.Text = "點我試試"
# 建立多行文字方塊
$textBox1 = New-Object System.Windows.Forms.TextBox
$textBox1.Multiline = $true
$textBox1.Text = "Hello World"
$textBox1.Size = New-Object System.Drawing.Size(281, 227)
# 使用 FlowLayoutPanel 自動排版
$flowLayoutPanel1 = New-Object System.Windows.Forms.FlowLayoutPanel
$myForm.Controls.Add($flowLayoutPanel1)
$flowLayoutPanel1.Controls.Add($textBox1)
$flowLayoutPanel1.Controls.Add($button1)
$flowLayoutPanel1.Dock = "Fill"
$flowLayoutPanel1.FlowDirection = "TopDown"
# 事件處理:PowerShell 使用 ScriptBlock 封裝委派
$button1ClickEventHandler = [System.EventHandler] {
[System.Windows.Forms.MessageBox]::Show("Hello from PowerShell!")
}
$button1.Add_Click($button1ClickEventHandler)
# 啟動應用程式
$app::EnableVisualStyles()
$app::Run($myForm)
.NET 事件需要委派,PowerShell 允許使用 [System.EventHandler] { ... } 語法將 ScriptBlock 自動轉換為委派實例,再透過 Add_Click() 等方法掛鉤,極為直觀。
手寫座標既繁瑣又難維護,FlowLayoutPanel 配合 Dock = "Fill" 讓控制項自動隨視窗大小調整,FlowDirection = "TopDown" 則實現垂直堆疊,零座標計算即可完成響應式佈局。
WinForms 架構建立在 Windows 訊息迴圈之上。Application.Run(form) 內部會:
form.Show())。GetMessage/DispatchMessage 迴圈處理 WM_PAINT、WM_MOUSEMOVE、WM_COMMAND 等訊息。若直接呼叫 $myForm.Show(),腳本執行完畢即退出,視窗自然無法停留。
BackgroundWorker 或 Runspace 多執行緒處理。PowerShell + WinForms 是「輕量級桌面開發」的利器,尤其適合 IT 運維、自動化工程師快速交付圖形化工具。掌握此技能,讓您的腳本不再局限於命令列,擁抱圖形化互動的無限可能。