Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c中的组合键触发按钮单击事件#_C#_Button_User Controls_Click_Key - Fatal编程技术网

C# 使用c中的组合键触发按钮单击事件#

C# 使用c中的组合键触发按钮单击事件#,c#,button,user-controls,click,key,C#,Button,User Controls,Click,Key,我创建了从普通.Net按钮派生的自定义按钮,并添加了以下属性以添加快捷键组合: public Keys ShortCutKey { get; set; } 我想让这个组合触发按钮的click事件,但不知道当按钮放置在表单上时如何实现。我知道做按钮快捷方式的标准方法是在快捷字符前使用&但我需要使用组合键 有什么想法吗 非常感谢我假设您正在使用WinForms,因为WinForms控件标题中使用了符号和字符来表示快捷方式字符。如果是这种情况,那么您可以使用WinForms按钮上的方法来手动触发Cl

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

public Keys ShortCutKey { get; set; }
我想让这个组合触发按钮的click事件,但不知道当按钮放置在表单上时如何实现。我知道做按钮快捷方式的标准方法是在快捷字符前使用&但我需要使用组合键

有什么想法吗


非常感谢

我假设您正在使用WinForms,因为WinForms控件标题中使用了符号和字符来表示快捷方式字符。如果是这种情况,那么您可以使用WinForms
按钮上的方法来手动触发
Click
事件


如果情况并非如此,而您实际上正在使用WPF;然后查看他在评论中发布的链接。

重写表单的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被假定为自定义按钮控件类。

请查看输入绑定。谢谢你的回复。是的,我正在使用WinForms。我还是不明白Button.PerformClick怎么会被激活?我必须在按钮所在的每个表单上编写代码来捕获密钥组合。我希望能够将我的自定义按钮放置在任何窗体上,并让开发人员从属性窗口设置键组合。然后我需要这个组合来触发click事件,而不必向表单中添加任何代码。希望这是有道理的。Thanks@user1131661据我所知,您应该能够通过监听自定义按钮实现中的键盘事件,然后在按下指定的快捷组合时触发
单击
事件来实现这一点。请注意,在这种情况下,最好将快捷方式组合存储在自定义按钮实现中,并通过属性公开。这有帮助吗?嗨,塞缪尔,谢谢你的回复。我刚试过。我似乎只能在按钮有焦点时捕捉键盘事件。我已重写ProcessCmdKey&ProcessDialogKey以尝试使其正常工作。这就是你的意思吗?@user1131661这正是我的意思。但是,这些方法只有在控件处于焦点时才会触发。由于您需要听全局按键,因此最好开发一些听键盘的方法,而不是按
按钮上的按键。看一看这篇文章,了解一下您可能会如何做这件事。请注意,您可能需要运行一些后台线程,其唯一目的是检查密钥状态。是的,我可以这样做,但如果我有大量的按钮和表单,我必须为每个按钮和表单执行这些操作。我需要能够只需放下表单上的按钮,并通过属性面板设置快捷键。因此,我需要button类中的所有代码。迭代控件以找到您的按钮。帖子更新了,太好了。我已经采纳了你的建议。谢谢你的帮助