使用大小写的键修饰符不起作用

本文关键字:不起作用 大小写 | 更新日期: 2023-09-27 18:03:10

我已经定义,当一个键按下时,使用大小写来区分不同的键,一个动作发生

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.B:
            //something happens here
        break;
    }
}

当我尝试添加一个键修饰符时,例如"Ctrl",我是这样做的

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.B && e.Modifiers == Keys.Control:
            //something happens here
        break;
    }
}

编辑:当我尝试这样做时,它显示'&&' Cannot be applied to operands of type 'Windows.System.Forms.Keys' and 'bool'

如何正确地完成?

使用大小写的键修饰符不起作用

不能将if语句作为case标签的一部分。Case直接将标签中的常量值与开关中的变量进行比较;&&算子的结果是bool,不能与KeyEventArg相比较。您需要单独添加它或使用if语句。

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.B:
            if (e.Modifiers == Keys.Control)
                //something happens here
            //else
            break;
    }
}

我做错了吗?

当然,你是!case标签不是条件,它们是与switch中的表达式进行比较的值。

您可以在需要检查其他条件的每个case中添加一个额外的if,或者使用if - then - else链:

private void Form1_KeyDown(object sender, KeyEventArgs e) {
    if (e.KeyCode == Keys.B && e.Modifiers == Keys.Control) {
        //something happens here
    } else if (...) {
    } else {
    }
}

根据其他答案,您仍然可以通过创建Tuple并根据哈希代码检查case语句来使用case语句,因为Tuple是引用类型,例如

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    int hash = new Tuple<Keys, Keys>(e.KeyCode, e.Modifiers).GetHashCode();
    switch (hash)
    {
        case new Tuple<Keys, Keys>(Keys.B, Keys.Control).GetHashCode():
            //something happens here
        break;
    }
}