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
WinForms のフォームを表示している間は、Windows メッセージループが動いている必要があります。
ShowDialog()(モーダル)[System.Windows.Forms.Application]::Run()(メインループ)よく使う基本コントロールの例です。
$label = New-Object System.Windows.Forms.Label
$label.Text = 'メッセージ'
$label.AutoSize = $true
$label.Location = '10,10'
$form.Controls.Add($label)
$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Width = 200
$textBox.Location = '10,40'
$form.Controls.Add($textBox)
$button = New-Object System.Windows.Forms.Button
$button.Text = 'OK'
$button.Location = '10,80'
$form.Controls.Add($button)
WinForms のイベントは、ユーザー操作や状態変化を通知する仕組みです。 例:ボタンがクリックされた、キーが押された、マウスが動いた、テキストが変更された、など。
WinForms のイベントは .NET のイベントモデルに従っており、 イベントハンドラは次のようなシグネチャを持ちます:
void Handler(object sender, EventArgs e)
この 2 つの引数が、PowerShell の $sender と $eventArgs の元になっています。
System.Object だが、実体は Button や TextBox などSystem.EventArgs またはその派生型| イベント | $eventArgs の型 | 含まれる情報 |
|---|---|---|
| Click | EventArgs | 特になし |
| KeyDown | KeyEventArgs | KeyCode, Shift, Alt など |
| MouseMove | MouseEventArgs | X, Y, Button など |
$button.Add_Click({
# クリック時の処理
})
Register-ObjectEvent -InputObject $button -EventName Click -Action {
# クリック時の処理
}
$button.Add_Click({
# $_ は EventArgs オブジェクト
$_.Sender # 発生元
$_.EventArgs # イベント引数
})
$button.Add_Click({
param($sender, $eventArgs)
[System.Windows.Forms.MessageBox]::Show("押された: $($sender.Text)")
})
$message = '初期メッセージ'
$button.Add_Click({
param($sender, $eventArgs)
[System.Windows.Forms.MessageBox]::Show($message)
})
$message = '変更後メッセージ'