1

興味を持ち続けるために、私は自分のプロジェクトに小さなイースターエッグを入れようとしています (主に自分を楽しませるためです)。「aswzaswz」という一連の文字を入力すると、「秘密の関数」が得られる Web サイトをいくつか見たことがあります。C# でこれを実現するにはどうすればよいでしょうか。

過去に修飾キーを使用して「秘密の機能」を割り当てたことがあります

        bool showFunThing = (Control.ModifierKeys & Keys.Control) == Keys.Control;

しかし、もう少し機密性を高めたい (修飾キーなし) フォームに、入力なしで入力された特定の単語を検出することを望んでいました...それを行う必要があると思われるメソッドを作成しました:

    private StringBuilder _pressedKeys = new StringBuilder();

    protected override void OnKeyDown(KeyEventArgs e)
    {
        const string kWord = "fun";
        char letter = (char)e.KeyValue;
        if (!char.IsLetterOrDigit(letter))
        { return; }
        _pressedKeys.Append(letter);
        if (_pressedKeys.Length == kWord.Length)
        {
            if (_pressedKeys.ToString().ToLower() == kWord)
            {
                MessageBox.Show("Fun");
                _pressedKeys.Clear();
            }
        }
        base.OnKeyDown(e);
    }

今、私はそれを配線する必要がありますが、フォームデザイナーでイベントを発生させる方法がわかりません...私はこれを試しました:

    this.KeyDown +=new System.Windows.Forms.KeyEventHandler(OnKeyDown);

これにはいくつかのバリエーションがありますが、起動(またはコンパイル)しないため、何かが欠けています。OnKeyDown メソッドが特定の署名を期待していることがわかりますが、引数を指定していないこのような他のメソッドがあります。

混乱してしまったのではないかと心配しているので、SOに助けを求めています...誰か?

編集: ProcessCmdKey は、次のように動作するようです:

    private StringBuilder _pressedKeys = new StringBuilder();
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        const string kWord = "fun";
        char letter = (char)keyData;
        if (!char.IsLetterOrDigit(letter))
        {return true;}
        _pressedKeys.Append(letter);
        if (_pressedKeys.Length == kWord.Length)
        {
         if (_pressedKeys.ToString().ToLower() == kWord)
            {
                MessageBox.Show("Fun");
                _pressedKeys.Clear();
            }
            _pressedKeys.Clear();
        }
     return true;
    }

皆さんありがとう!

4

2 に答える 2

1

これを試して:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.P|Keys.Control))
    {
        //do my prank
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

これは、CTRL+Pを押すと発生します。

参照:ProcessCmdKey

このメソッドは、メッセージの前処理中に呼び出され、コマンドキーを処理します。コマンドキーは、通常の入力キーよりも常に優先されるキーです。コマンドキーの例には、アクセラレータやメニューショートカットが含まれます。メソッドは、コマンドキーを処理したことを示すためにtrueを返す必要があります

于 2012-07-09T09:05:07.653 に答える
0

仮想メソッドをオーバーライドしているため、KeyDown イベントを処理する必要はありません。デバッグする場合、何かが仮想メソッドを呼び出す場合は、オーバーライドされたメソッドでブレークポイントにヒットする必要があります。

ただし、正しいクラスで正しいメソッドをオーバーライドしていると確信していますか? ちょっとした考え。

于 2012-07-09T08:48:13.603 に答える