【问题标题】:Fire button click event using a key combination in c#使用 C# 中的组合键触发按钮单击事件
【发布时间】:2012-02-14 00:48:41
【问题描述】:

我创建了从普通 .Net 按钮派生的自定义按钮,并添加了以下属性来添加快捷键组合:

public Keys ShortCutKey { get; set; }

我希望这个组合能够触发按钮的单击事件,但不知道当按钮放置在表单上时如何实现。我知道执行按钮快捷方式的标准方法是在快捷方式字符之前使用 &,但我需要使用组合键。

有什么想法吗?

非常感谢

【问题讨论】:

标签: c# button user-controls click key


【解决方案1】:

覆盖表单的 ProcessCmdKey() 方法以检测快捷键。像这样:

    private bool findShortCut(Control.ControlCollection ctls, Keys keydata) {
        foreach (Control ctl in ctls) {
            var btn = ctl as MyButton;
            if (btn != null && btn.ShortCutKey == keydata) {
                btn.PerformClick();
                return true;
            }
            if (findShortCut(ctl.Controls, keydata)) return true;
        }
        return false;
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (findShortCut(this.Controls, keyData)) return true;
        return base.ProcessCmdKey(ref msg, keyData);
    }

假设 MyButton 是您的自定义按钮控件类。

【讨论】:

  • 是的,我可以这样做,但如果我有大量按钮和表单,我必须为每个按钮都这样做。我需要能够将按钮放在表单上并通过属性面板设置快捷键。所以我需要按钮类中的所有代码。
  • 迭代控件以找到您的按钮。帖子已更新。
  • 太棒了。我已经使用了你的建议。感谢您的帮助
【解决方案2】:

我假设您使用的是 WinForms,因为在 WinForms 控件标题中使用 & 字符来表示快捷方式字符。如果是这种情况,那么您可以在 WinForms Button 上使用 Button.PerformClick() 方法来手动触发 Click 事件。

如果不是这种情况,而您实际上正在使用 WPF;然后查看Dmitry 在他对WPF Input Bindings 的评论中发布的链接。

【讨论】:

  • 感谢您的回复。是的,我正在使用 WinForms。我仍然不明白 Button.PerformClick 将如何被触发?我必须在按钮所在的每个表单上编写代码以捕获组合键。我希望能够将我的自定义按钮放在任何表单上,并让开发人员从属性窗口设置组合键。然后我需要该组合来触发点击事件,而无需向表单添加任何代码。希望这是有道理的。谢谢
  • @user1131661 据我了解,您应该能够通过在自定义按钮实现中侦听键盘事件并在按下指定的快捷键组合时触发Click 事件来实现这一点。请注意,在这种情况下,您最好将快捷方式组合存储在自定义按钮实现内部 中并通过属性公开。这有帮助吗?
  • 嗨塞缪尔,感谢您的回复。我刚刚试过了。当按钮具有焦点时,我似乎只能捕获键盘事件。我已经覆盖了 ProcessCmdKey 和 ProcessDialogKey 来尝试让它工作。这是你的意思吗?
  • @user1131661 这就是我的意思。但是,这些方法只会在控件处于焦点时触发。因为您需要听全局按键,所以最好开发一些听键盘的方法,而不是Button 上的按键。请查看this 文章,了解如何执行此操作。请注意,您可能必须运行一些后台线程,其唯一目的是检查键状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2010-10-21
相关资源
最近更新 更多