我在我的WinForm上捕获键但是我试图查看按下的键是否为'String' - 获得异常

时间:2010-04-28 02:36:29

标签: c# key

这是我的代码:

        void gkh_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == neededLetter as Keys)
            {
                if (neededLetter == "n")
                {
                    neededLetter = "o";
                }
                else if (neededLetter == "o")
                {
                    neededLetter = "t";
                }
                else if (neededLetter == "t")
                {
                    neededLetter = "e";
                }
                else if (neededLetter == "e")
                {
                    this.Show();
                }
            }
            else
            { 
                neededLetter = "n";
            }
        }

我在第一个If块上收到错误:

  

as运算符必须与a一起使用   引用类型或可空类型

编辑:更清楚:

用户按下一个键,计算机将该e.Keycode与设置为字母“n”的字符串变量进行比较。如果为true,则将变量neededLetter设置为“o”。

之后,当用户按下另一个键时,如果是“o”,则将requiredletter保存到“t”。等等。

3 个答案:

答案 0 :(得分:0)

KeyEventArgs.KeyCode是枚举值。从MSDN文档:

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Determine whether the key entered is the F1 key. If it is, display Help.
    if(e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
    {
        // Display a pop-up Help topic to assist the user.
        Help.ShowPopup(textBox1, "Enter your name.", new Point(textBox1.Bottom, textBox1.Right));
    }
    else if(e.KeyCode == Keys.F2 && e.Modifiers == Keys.Alt)
    {
        // Display a pop-up Help topic to provide additional assistance to the user.
        Help.ShowPopup(textBox1, "Enter your first name followed by your last name. Middle name is optional.",
            new Point(textBox1.Top, this.textBox1.Left));
    }
}

答案 1 :(得分:0)

使用此:

if (e.KeyCode == (Keys)neededLetter[0])

也许您应该将requiredLetter设为char类型,因此您可以使用:

if (e.KeyCode == (Keys)neededLetter)

或者更好的是,只需将needLetter设为Keys类型,这样你就可以这样做:

if (e.KeyCode == neededLetter)
{
    if (neededLetter == Keys.N)
        neededLetter = Keys.O;
    else if (neededLetter == Keys.O)
        neededLetter = Keys.T;

    ...
}

@ Sergio,re:仅一个键输入:

是的,它只接受一个键盘输入。事实上,如果你想要解释像 Ctrl + A 这样的组合键,你不能同时在e.KeyCode中捕获它们,只能按最后一个按键(常规键或否则(键修饰符))在e.KeyCode中注册。如果没有像e.Control,e.Shift,e.Alt那样的键修饰符布尔属性,我们将无法读取键盘快捷键,我们将不得不滚动我们自己的例程来设置状态变量并检测那些键盘修饰符仍由用户持有。但幸运的是,有一个内置属性,表明修饰符仍然由用户持有,所以我们可以这样做:

if (e.KeyCode == Keys.A && e.Control)
   MessageBox.Show("Test");

并测试e.KeyCode仅注册最后一个键,无论它是键( A )还是键修饰符( Ctrl )。尝试按住 A (不要释放),然后按 Ctrl ,“测试”一词将弹出屏幕,最后按下( Ctrl )也在e.KeyCode上注册。但是如果您按住 Ctrl 然后 A ,屏幕上会弹出“Test”字样,e.Control是一个指示 Ctrl 仍由用户持有。

答案 2 :(得分:0)

您可以使用KeyPress使用string buffer = ""; //buffer to store what the user typed: n, no, not, etc... void gkh_KeyPress(object sender, KeyPressEventArgs e) { buffer += e.KeyChar; //add key to the buffer, then check if we've made progress if (buffer.IndexOf("note") > -1) { this.Show(); //"notes" matched completely buffer = ""; //reset for another run } else if ("note".IndexOf(buffer) != 0) { buffer = ""; //Another key not in sequence was hit } } 进行更简单的逻辑,如下所示:

{{1}}