1

为了让自己保持兴趣,我尝试在我的项目中放一些复活节彩蛋(主要是为了自娱自乐)。我看过一些网站,您可以在其中键入一系列字母“aswzaswz”并获得“秘密功能” - 我将如何在 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 回答