高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

フレームワークがサポートしてないショートカットキーを設定する方法

 Delphiで同様のテクニックがあったので、それの応用です。
.NETでは、Alt+英字キーや、方向キーなど多くのキーの組み合わせがショートカットキーに使えません。
 WindowsのGUIガイドラインだったかに使うなと書いてあったのだと思いますが、いい迷惑です。Alt+英字キーはほかとかぶらないように気をつければいいだけの話しだし、テキストエディタなんかじゃショートカットキーには出来得ない英字キー単体などだって、ペイントソフトやメディアプレイヤーなんかとなると、わけが違う(たとえばメディアプレイヤーで、再生するためにいちいちCtrl+何かを押させるなんてめんどくさい。Spaceキーワンタッチとか、そういうのの方がいいですよね)。
要は使いやすいならいいんだと思うんですが。それを決めるのはフレームワークじゃなく、わたしたちユーザーなり開発者なりだと思うんです。


 ――話が脱線しました(^^ゞさて、こんなキーをショートカットキーにする方法。
上のページにも書いてあったと思いますが、メニューのキャプションの末尾に\9(表示させたいキーセンス)\0と追加して、
フォームのKeyDownなりで、それと同じキーの組み合わせをトラップしてあげればいいんです。\0を最後に置くのがミソとのことです(やらないとショートカットキーの位置に表示されません)。
 いちいち実行時に再設定するのも面倒ですから、フォームデザイナで設定してしまうと楽です。InitializeComponents()内を修正することになってしまいますが、該当メニューのTextプロパティを設定するところに、上の文字列を追加します。

  this.menuItem1.Text = "テストメニュー"

とあったら、

  this.menuItem1.Text = "テストメニュー\9Alt+A\0"

と言う感じですね。SharpDevelopは特に、InitializeComponents()内の修正でどうにか出来ることが少なく(大半は勝手に修正される)なってますが、これは大丈夫みたいです。


 まあ、InitializeComponents()内は手編集すべきではないでしょうが、場合によってはこれを使った方がいい場合も結構あるでしょう。コピーして増やしたラベルのうち一個を、LinkLabelにかえるとか。Delphiだったら簡単に出来ます*1が.NETでは結構手間ですしね。

*1:クリップボードにコピーしたコントロールは全部テキストで表現されるので、それをエディタに持って行って書き換えるだけでいい