【问题标题】:Keyboard shortcut for a button按钮的键盘快捷键
【发布时间】:2011-12-12 22:17:39
【问题描述】:

在 C# (Microsoft Visual Studio 2010) 中,如何将键盘快捷键分配给如下按钮?

    private void closeButton_Click(object sender, EventArgs e)
    {
        // Close the program
        this.Close();
    }

我知道我可以在按钮的文本中使用“&”字符并创建一个 Alt - n 快捷方式,但我想创建一个按键快捷方式,如 c 执行上述。

【问题讨论】:

    标签: c# winforms keyboard shortcut


    【解决方案1】:

    KeyDown 是你的朋友 ;) 例如,如果你想在按下 Shift 的同时使用快捷键 A,试试这个:

        void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.A && e.Shift) 
                // Do something
        }
    

    如果你想要一个“真正的”键盘快捷键,你可以使用钩子。 查看 Stack Overflow 问题RegisterHotKeys and global keyboard hooks?

    【讨论】:

    • 噢,这真的是 WinForms 让你做的事吗?让 VCL 的 TAction 看起来非常棒。
    • 对不起,我听不懂你的意思;)请换个说法。提前致谢
    • 我的意思是,与 Delphi VCL 的功能相比,这是一种非常费力的快捷方式实现方式,毕竟它是 WinForms 的灵感来源。据我所知,WinForms 在动作处理方面非常缺乏。也许 WPF 更好,我不知道。
    • @dknaack:我认为要使您的代码正常工作,表单的KeyPreview 属性必须设置为true
    • @David:确切地说,我不会称这种语法“费力”,主要是因为连接键盘快捷键并不是你必须经常做的事情(也许 你 i> 必须经常这样做,在这种情况下,Delphi 将具有一定的吸引力)。
    【解决方案2】:

    这是一种不同的方法:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        switch(keyData)
        {
             case Keys.F2:
                 // do something...
                 return true;
             case Keys.F3:
                 // do something...
                 return true;
             case Keys.F4:
                 // do something...
                 return true;
             default:
                 return base.ProcessCmdKey(ref msg, keyData);
        }            
    }
    

    您无需更改KeyPreview 值。

    【讨论】:

    • 如何在swich 语句中使用Ctrl + S
    【解决方案3】:

    如果你想在 switch 语句中添加 Ctrl + S 这样你也可以尝试下面的代码。

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            switch (keyData)
            {
                case Keys.Control | Keys.S:
                    // do something...
                    return true;
                case Keys.Control |Keys.Alt | Keys.S:
                    // do something...
                    return true;
                case Keys.F2:
                    // do something...
                    return true;
                case Keys.F3:
                    // do something...
                    return true;
                case Keys.F4:
                    // do something...
                    return true;
                default:
                    return base.ProcessCmdKey(ref msg, keyData);
            }
        }
    

    【讨论】:

    • 这个解决方案对我来说比使用 KeyDown 更好,因为无论您在表单上的哪个位置,它都会被触发。使用 KeyDown 如果文本框处于活动状态,则不会触发事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多