如何以编程方式查找在C#Winform中分配的所有快捷键的列表?

如何以编程方式查找在C#Winform中分配的所有快捷键的列表?,c#,winforms,keyboard-shortcuts,C#,Winforms,Keyboard Shortcuts,如何以编程方式获取应用程序中使用的快捷键列表?我有一个winform,其中有许多菜单和菜单项(包括动态生成的菜单项),并指定了快捷键 很难跟踪所有快捷键,并认为向用户显示一个列表会很好。我发现您的要求中有几个问题: 对于File New,您必须键入 首先让学生把结果放在课堂上: using System.Windows.Forms; class ShortCut { public string ShortcutSequence {get; set;} = String.Empty;

如何以编程方式获取应用程序中使用的快捷键列表?我有一个winform,其中有许多菜单和菜单项(包括动态生成的菜单项),并指定了快捷键


很难跟踪所有快捷键,并认为向用户显示一个列表会很好。

我发现您的要求中有几个问题:

  • 对于
    File New
    ,您必须键入

    首先让学生把结果放在课堂上:

    using System.Windows.Forms;
    class ShortCut
    {
        public string ShortcutSequence {get; set;} = String.Empty;
        ToolStripItem ToolStripItem {get; set;}
    }
    
    获取ToolStripMenuItem的快捷方式,如果没有快捷方式,则获取默认值:

    public static char GetShortcutCharOrDefault(this ToolStripMenuItem menuItem)
    {
        // Return the character after the ampersand in property Text,
        // or null if there is no such thing
        return menuItem?.Text?.SkipWhile(c => c != '&') // skip until &
            .Skip(1)                                    // skip the &
            .Select(c => char.ToUpper(c))               // make the char uppercase
            .FirstOrDefault()                           // char after the ampersand
            ?? default(char);                           // or default char if no text
    }
    
    从ToolStripMenuItems序列到快捷方式序列

    public static IEnumerable<Shortcut> ToShortcuts(
        this IEnumerable<ToolStripMenuItem> menuItems,
        string parentShortcutSequence)
    {
        // TODO: handle invalid input
    
        foreach (var menuItem in menuItems)
        {
            char shortcutCar = menuItem.GetShortcutChar();
            if (shortCutChar != default(char))
            {
               // This menuItem has a shortcut.
               var shortcut = new ShortCut
               {
                   ShortcutSequence = parentShortcutSequence + shortcutChar,
                   ToolstripItem = menuItem,
               }
    
               // return this shortcut
               yield return shortcut;
    
               // and check for the shortcuts of the sub menu items
               // recursively!
               var subShortcuts = menuItem.Items.ToShortcuts(shortcut.ShortcutSequence);
               foreach (var subShortcut in subShortcuts)
               {
                   yield return subShortCut);
               }
            }
        }
    }
    
    公共静态IEnumerable ToShortcuts(
    这是一个数不清的菜单,
    字符串parentShortcutSequence)
    {
    //TODO:处理无效输入
    foreach(菜单项中的变量菜单项)
    {
    char shortcutCar=menuItem.GetShortcutChar();
    if(shortCutChar!=默认值(char))
    {
    //此菜单项有一个快捷方式。
    var快捷方式=新快捷方式
    {
    ShortcutSequence=parentShortcutSequence+shortcutChar,
    ToolstripItem=menuItem,
    }
    //返回此快捷方式
    收益回报捷径;
    //并检查子菜单项的快捷方式
    //递归地!
    var subShortcuts=menuItem.Items.ToShortcuts(shortcut.ShortcutSequence);
    foreach(子Shortcuts中的var子Shortcut)
    {
    收益率-收益率(次短切);
    }
    }
    }
    }
    
    用法:

    MenuStrip mainMenuStrip = ...
    IEnumerable<ToolStripItem> menus = mainMenuStrip.Items.Cast<ToolStripItem>();
    IEnumerable<Shortcut> shortcuts = menus.ToShortCusts(String.Empty);
    
    MenuStrip main MenuStrip=。。。
    IEnumerable menus=mainMenuStrip.Items.Cast();
    IEnumerable shortcuts=menus.ToShortCusts(String.Empty);
    
    即使你能做到这一点(我想不出一个可靠的方法来实现这一点),写这篇文章可能比只检查每个表单和审核要花更长的时间。你可以使用
    SendInput
    方法并在循环中尝试。你试过枚举菜单项并提取它们的快捷键属性,并确定值吗(尴尬,因为它有标志,但可行,因为它都是密钥枚举的一部分)。注意,您没有明确表示您正在使用ToolStripMenuItem,但我还想指出,如果您确实在使用ToolStripMenuItem,并且已在每个ToolStripMenuItem上设置了ShortcutKeyDisplayString属性,那么您可以使用它,如果它只是用于向user@CaiusJard具体来说,我想到的是toolstrip菜单,不确定其他地方是否存在快捷键