FormでKeybordからの入力を受け取りたい
KeyDown(またはKeyUp、KeyPresでも可)イベントを使うと、例えば「Ctrl」+「s」のようなキー入力コマンドを受け取ることが出来ます。
これをうまく使うと隠しコマンドのようなものを作ることが出来ます。
これが何が便利かというと、ボタンなどを設置しないので、特定のキーの組み合わせの入力を知っている人だけが実行できるイベント(管理者向けイベント)を作ることが出来ます。
private void textBox1_KeyDown(object sender, KeyEventArgs e) { // 下がったキーがCtrlキー + S の場合 if (e.KeyCode == Keys.S && e.Control == true) { } }
テキストボックスなどは、このようにします。
textBox1_KeyDown
イベントは、textBox1がアクティブの時のみ有効です。
private void Form1_KeyDown(object sender, KeyEventArgs e) { // 下がったキーがCtrlキー + S の場合 if (e.KeyCode == Keys.S && e.Control == true) { } }
しかし、Formで受け取りたいときは、これだけではうまくいきません。
KeyPreview
をTrueにしなければなりません。
しかしこのとき、すべてのKeyDown
をいったんFormで受け取ることになります。
Javascriptでの親要素へのイベントプロパゲーションのような感じです。
以下のようにtextBox1にKeyDown
を設定してもFormにもKeyDown
が設定されていると、textBox1でKeyDown
をしてもtextBox1とFormの両方が受け取ることになります。
private void textBox1_KeyDown(object sender, KeyEventArgs e) { }
ファミコンの隠しコマンドっぽいものとか
以下のようにすると、「Ctrl」を押したまま「S」「D」「A」と押したときのみ発火します。
int state = 0; private void Form1_KeyDown(object sender, KeyEventArgs e) { // 下がったキーがCtrlキー + S の場合 if (state == 0 && e.KeyCode == Keys.S && e.Control == true) { state += 1; } if (state == 1 && e.KeyCode == Keys.D && e.Control == true) { state += 1; } if (state == 2 && e.KeyCode == Keys.A && e.Control == true) { MessageBox.Show("Congratulations!"); } } private void Form1_KeyUp(object sender, KeyEventArgs e) { // 上がったキーがCtrlキーの場合 if (e.KeyCode == Keys.ControlKey) { state = 0; } }