SendKeys.Sendと入力コントロール


このように最小限のメニュー項目とテキストボックスコントロールを載せたフォームを作り、メニュー項目が選択された場合のコードを以下のように書いたとしよう。(面倒ならDoubleClickイベントを使っても良い)

private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
    SendKeys.Send("^v");
}

このようにSendKeysクラスを使ってキー入力をエミュレートする方法は国際化に対応できないこともあり、推奨されていないが、それでもクリップボードとの入出力処理を簡易に書く場合にはよく紹介されていたりする。私も過去に試して上手く動いた記憶があるのだが、同様のコードを書いて試すと以下のように例外が発生する。

System.NullReferenceException が発生しました。
  Message="オブジェクト参照がオブジェクト インスタンスに設定されていません。"
  Source="System.Windows.Forms"
  StackTrace:
       場所 System.Windows.Forms.SendKeys.LoadSendMethodFromConfig()

不思議なことにこの例外、発生するのは初回だけでありその後は問題なく"CTR+V"がアプリケーションに渡されるのである。
さて、一体何が起こっているのだろう。

追記: 例外が発生するのはデバッグ実行時だけである。

追記: "^v"を"^V"と大文字にすると例外は発生しない。理由は不明。(2008/1/21)