PowerShell WinForms 基本文法まとめ

1. 最小構成のフォーム表示

Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.Text = '最小フォーム'
$form.Width  = 400
$form.Height = 300

$form.ShowDialog() | Out-Null

2. フォーム維持のためのメッセージループの種類

WinForms のフォームを表示している間は、Windows メッセージループが動いている必要があります。

2-1. ShowDialog()(モーダル)

2-2. [System.Windows.Forms.Application]::Run()(メインループ)

3. 基本的なコントロール

よく使う基本コントロールの例です。

3-1. Label

$label = New-Object System.Windows.Forms.Label
$label.Text = 'メッセージ'
$label.AutoSize = $true
$label.Location = '10,10'
$form.Controls.Add($label)

3-2. TextBox

$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Width = 200
$textBox.Location = '10,40'
$form.Controls.Add($textBox)

3-3. Button

$button = New-Object System.Windows.Forms.Button
$button.Text = 'OK'
$button.Location = '10,80'
$form.Controls.Add($button)

4. イベントの基礎

4-1. イベントとは何か

WinForms のイベントは、ユーザー操作や状態変化を通知する仕組みです。 例:ボタンがクリックされた、キーが押された、マウスが動いた、テキストが変更された、など。

4-2. コントロールとイベントの関係

4-3. .NET のイベントモデル(重要)

WinForms のイベントは .NET のイベントモデルに従っており、 イベントハンドラは次のようなシグネチャを持ちます:

void Handler(object sender, EventArgs e)

この 2 つの引数が、PowerShell の $sender$eventArgs の元になっています。

4-4. $sender とは何か(本質)

4-5. $eventArgs とは何か(本質)

イベント$eventArgs の型含まれる情報
ClickEventArgs特になし
KeyDownKeyEventArgsKeyCode, Shift, Alt など
MouseMoveMouseEventArgsX, Y, Button など

5. PowerShell におけるイベントハンドラ

5-1. Add_イベント名() を使う(一般的)

$button.Add_Click({
    # クリック時の処理
})

5-2. Register-ObjectEvent を使う

Register-ObjectEvent -InputObject $button -EventName Click -Action {
    # クリック時の処理
}

6. PowerShell における $sender / $eventArgs / $_ の扱い

6-1. 重要ポイント

6-2. param() を書かない場合($_ を使う)

$button.Add_Click({
    # $_ は EventArgs オブジェクト
    $_.Sender     # 発生元
    $_.EventArgs  # イベント引数
})

6-3. param() を書いた場合($sender / $eventArgs が使える)

$button.Add_Click({
    param($sender, $eventArgs)

    [System.Windows.Forms.MessageBox]::Show("押された: $($sender.Text)")
})

6-4. イベントハンドラのスコープ(クロージャ)

$message = '初期メッセージ'

$button.Add_Click({
    param($sender, $eventArgs)
    [System.Windows.Forms.MessageBox]::Show($message)
})

$message = '変更後メッセージ'

6-5. まとめ