【问题标题】:Programming a Hotkey in C# with Visual Studio 2010使用 Visual Studio 2010 在 C# 中编写热键
【发布时间】:2013-03-06 05:27:48
【问题描述】:

我有一个小表格,里面有 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; 
    } 
} 

【问题讨论】:

  • 你开始吸引那些没有多大意义的答案。告诉我们更多关于您想要的行为的信息。是否要将每个数字键分配给表单上的复选框?
  • 对不起。我试图让它尽可能清楚。我希望 NumPad 对应 9 个复选框,这样点击它们就会选中和取消选中相应的框。

标签: c# visual-studio-2010 checkbox hotkeys


【解决方案1】:

您的问题并未说明您是否希望这是特定于应用程序的热键或系统热键。我在假设它是特定于应用程序的假设下进行操作。您的假设是正确的,您需要将 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.
        }

    }

【讨论】:

  • 我已经添加了这个,并把 this.KeyPreview = true;进入 Form2() (我也在 Form2_Keydown 中尝试过),无论我按哪个键,我仍然没有让 Form2_Keydown() 执行。
  • 点击热键时哪个表格有焦点
  • 另外,您如何将事件处理程序添加到您的 Form2。它应该类似于表单构造函数中的this.KeyDown += new KeyEventHandler(Form2_KeyDown);
  • 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");休息;默认值:中断; } } 对不起,我不知道在哪里放代码。我不确定哪个窗口有焦点
  • 我给你的代码工作代码,只有它所在的表单有焦点。如果您想在全局范围内执行此操作,则需要创建一个全局 Hook。
【解决方案2】:

现在可以简单地在要使用 ALT 启用的字母之前添加一个 & 符号。欲了解更多信息:

https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-create-access-keys?view=netdesktop-5.0

【讨论】:

    【解决方案3】:

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

    _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...
    }
    

    【讨论】:

    • 复选框仍然需要有焦点。问题指定即使复选框没有焦点,它也应该工作。
    猜你喜欢
    • 1970-01-01
    • 2011-02-23
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多