有一些乐趣-什么是包含密钥功能并启动KeyDown事件的好方法



为了保持自己的兴趣,我试着在我的项目中放一些复活节彩蛋(主要是为了自娱自乐)。我见过一些网站,在那里你可以键入一系列字母"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;
    }

谢谢大家!

试试这个:

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以指示它具有已处理命令密钥

您正在重写一个虚拟方法,因此不需要处理KeyDown事件。如果您进行调试,那么如果有东西调用了虚拟方法,那么您应该在覆盖方法中遇到断点。

你确定你在正确的类中重写了正确的方法吗?只是一个想法。

最新更新