如何以编程方式查找在C#Winform中分配的所有快捷键的列表?
如何以编程方式获取应用程序中使用的快捷键列表?我有一个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;
很难跟踪所有快捷键,并认为向用户显示一个列表会很好。我发现您的要求中有几个问题:
- 对于
,您必须键入File New
首先让学生把结果放在课堂上:
获取ToolStripMenuItem的快捷方式,如果没有快捷方式,则获取默认值:using System.Windows.Forms; class ShortCut { public string ShortcutSequence {get; set;} = String.Empty; ToolStripItem ToolStripItem {get; set;} }
从ToolStripMenuItems序列到快捷方式序列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 }
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);
方法并在循环中尝试。你试过枚举菜单项并提取它们的快捷键属性,并确定值吗(尴尬,因为它有标志,但可行,因为它都是密钥枚举的一部分)。注意,您没有明确表示您正在使用ToolStripMenuItem,但我还想指出,如果您确实在使用ToolStripMenuItem,并且已在每个ToolStripMenuItem上设置了ShortcutKeyDisplayString属性,那么您可以使用它,如果它只是用于向user@CaiusJard具体来说,我想到的是toolstrip菜单,不确定其他地方是否存在快捷键SendInput