イベントハンドラデリゲートの引数

MSHにてKeyPressイベント発生時の押下された文字を取得する方法に悩むこと数十分。

(C#)
public delegate void KeyPressEventHandler(object sender, KeyPressEventArgs e);

予想外に$_にKeyPressEventArgsオブジェクトが入っていた。$argsとかparam()あたりだと思ったんだけどなぁ。納得いかないけどまぁいいや…。
その他にも仕様なのかβだからなのか疑問点はてんこもり。

[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
#
function new_canvas {
  $c = new-object Windows.Forms.Control
  $c = add-member -i $c -t NoteProperty -n Char -va ' '
  $c = add-member -i $c -t ScriptMethod -n DrawChar -va {
    $g = [Drawing.Graphics]$args[0]
    $brush = new-object Drawing.SolidBrush([Windows.Forms.Control]::DefaultForeColor)
    $g.DrawString($this.Char, [Windows.Forms.Control]::DefaultFont, $brush, 0, 0)
  }
  return $c
}
#
$canvas = new_canvas
$canvas.add_Paint({
  $canvas.DrawChar($_.Graphics)
})
$canvas.add_KeyPress({
  $canvas.Char = $_.KeyChar
  $canvas.Refresh()
})
$canvas.SetBounds(0, 0, 100, 100)
#
$form = new-object Windows.Forms.Form
$form.Controls.Add($canvas)
$form.ShowDialog()