在Visual Studio 2010中用c#编写热键

本文关键字:中用 Visual Studio 2010 | 更新日期: 2023-09-27 18:04:29

我有一个小表单,里面有9个复选框。我试图为那些与Numpad相对应的框制作热键,但我遇到了最糟糕的问题。我有两个主要问题:

1。

 private void checkBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.NumPad7)
        {
            MessageBox.Show("It's working");
        }
    }

这是我的代码。它有效,但不是我想要的。它使消息出现,但只有当该复选框被突出显示。我认为KeyPreview可能在这种情况下有所帮助,但MSDN数据库并没有帮助我解决我的问题,试图找出如何使KeyPreview工作。

第二,我想让代码在我按下热键时检查框。我可以使用CheckState计算出的任何组合似乎都不起作用。如果有人有什么建议,我将不胜感激。


注释中的代码:

public Form2() 
{ 
    InitializeComponent(); 
    this.KeyPreview = true; 
    this.KeyDown += new KeyEventHandler(Form2_KeyDown);
} 
private void Form2_KeyDown(object sender, KeyEventArgs e) 
{ 
    switch (e.KeyCode) 
    { 
        case Keys.NumPad7: 
            MessageBox.Show("ABC"); 
            break; 
        default: 
            break; 
    } 
} 

在Visual Studio 2010中用c#编写热键

您的问题并没有说明您是否希望此热键是应用程序特定的热键还是系统热键。我假设它是一个特定于应用程序的。您的假设是正确的,您需要将Forms KeyPreview属性设置为true。然后,您需要将用于设置和清除复选框的代码放入Forms Keydown事件中,如下所示:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode )
    {
        case Keys.NumPad1:
            if (checkBox1.Checked)
                checkBox1.Checked = false;
            else
                checkBox1.Checked = true;
            break;
        case Keys.NumPad2:
            if (checkBox2.Checked)
                checkBox2.Checked = false;
            else
                checkBox2.Checked = true;
            break;
        case Keys.NumPad3:
            if (checkBox3.Checked)
                checkBox3.Checked = false;
            else
                checkBox3.Checked = true;
            break;
        case Keys.NumPad4:
            if (checkBox4.Checked)
                checkBox4.Checked = false;
            else
                checkBox4.Checked = true;
            break;
        case Keys.NumPad5:
            if (checkBox5.Checked)
                checkBox5.Checked = false;
            else
                checkBox5.Checked = true;
            break;
        case Keys.NumPad6:
            if (checkBox6.Checked)
                checkBox6.Checked = false;
            else
                checkBox6.Checked = true;
            break;
        case Keys.NumPad7:
            if (checkBox7.Checked)
                checkBox7.Checked = false;
            else
                checkBox7.Checked = true;
            break;
        case Keys.NumPad8:
            if (checkBox8.Checked)
                checkBox8.Checked = false;
            else
                checkBox8.Checked = true;
            break;
        case Keys.NumPad9:
            if (checkBox9.Checked)
                checkBox9.Checked = false;
            else
                checkBox9.Checked = true;
            break;
        default:
            break;
        }
    }

您可以为CheckedChanged事件创建一个公共的EventHandler,并检查哪个Checkbox被选中以运行相应的方法。

void checkBox_CheckedChanged(object sender, EventArgs e)
{
    CheckBox cb = (CheckBox)sender;
    switch(cb.Name)
    {
        case "checkBox1":
            if (cb.Checked)
                // Method to use when checkBox1 is checked
            else
                // Method to use when checkBox1 is unchecked

            break;
        case "checkBox2":
            if (cb.Checked)
                // Method to use when checkBox2 is checked
            else
                // Method to use when checkBox2 is unchecked
            break;
        case "checkBox3":
            if (cb.Checked)
                // Method to use when checkBox3 is checked
            else
                // Method to use when checkBox3 is unchecked
            break;
        default:
            break;
        //Implement your other checkBox's the same way.
        }
    }

现在可以简单地添加& &在您想要启用ALT的字母前。有关更多信息:

https://learn.microsoft.com/en us/dotnet/desktop/winforms/controls/how - -创建访问keys?view=netdesktop - 5.0

为所有复选框中的事件分配相同的事件处理程序:

_checkbox1.KeyDown += checkBox_KeyDown;
_checkbox2.KeyDown += checkBox_KeyDown;
// And so on...

然后,在里面做检查:

private void checkBox_KeyDown(object sender, KeyEventArgs e)
{
    var checkbox = sender as CheckBox;
    if (checkbox == null) { return; }
    if (e.KeyCode == Keys.NumPad1)
    {
        _checkbox1.IsChecked = !_checkbox1.IsChecked;
        return;
    }
    if (e.KeyCode == Keys.NumPad2)
    {
        _checkbox2.IsChecked = !_checkbox2.IsChecked;
        return;
    }
    // And so on...
}