Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有一些乐趣-什么是一个很好的方式,包括一个秘密的关键功能和火灾的KeyDown事件?_C#_.net_Winforms - Fatal编程技术网

C# 有一些乐趣-什么是一个很好的方式,包括一个秘密的关键功能和火灾的KeyDown事件?

C# 有一些乐趣-什么是一个很好的方式,包括一个秘密的关键功能和火灾的KeyDown事件?,c#,.net,winforms,C#,.net,Winforms,为了保持自己的兴趣,我尝试在我的项目中放一些复活节彩蛋(主要是为了娱乐自己)。我看过一些网站,在那里你可以输入一系列字母“aswzaswz”,你会得到一个“秘密函数”——我如何在C#中实现这一点 我过去使用修改键分配过一个“秘密函数” bool showFunThing = (Control.ModifierKeys & Keys.Control) == Keys.Control; 但是我想变得更隐秘一点(没有修改键),我只想表单能够检测到在没有任何输入的情况下键入的某

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

谢谢大家

您正在重写虚拟方法,因此不需要处理KeyDown事件。如果进行调试,如果有东西调用虚拟方法,则应该在重写的方法中命中断点


但是,您确定要在正确的类中重写正确的方法吗?只是想一想。

您正在重写一个虚拟方法,因此不需要处理KeyDown事件。如果进行调试,如果有东西调用虚拟方法,则应该在重写的方法中命中断点

但是,您确定要在正确的类中重写正确的方法吗?只是想一想。

试试这个:

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时,将触发此命令

参考:

在消息预处理期间调用此方法来处理命令 钥匙。命令键是始终优先于常规键的键 输入键。命令键的示例包括加速器和菜单 捷径。该方法必须返回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时,将触发此命令

参考:

在消息预处理期间调用此方法来处理命令 钥匙。命令键是始终优先于常规键的键 输入键。命令键的示例包括加速器和菜单 捷径。该方法必须返回true以指示它已 已处理命令键


我做了一个小测试,但它从来没有发射。。。这就是为什么我认为我需要表单设计器中的位…我做了一个小测试,但它从未启动。。。这就是为什么我认为我需要表单设计器中的位。。。