プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

C#で隠しコマンドを作る

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にしなければなりません。
f:id:s51517765:20210725184919p:plain

しかしこのとき、すべてのKeyDownをいったんFormで受け取ることになります。
Javascriptでの親要素へのイベントプロパゲーションのような感じです。
以下のようにtextBox1にKeyDownを設定してもFormにもKeyDownが設定されていると、textBox1でKeyDownをしてもtextBox1とFormの両方が受け取ることになります。

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{

}

dobon.net

ファミコンの隠しコマンドっぽいものとか

以下のようにすると、「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;
    }
}