You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将用户输入的快捷键字符串转换为MenuItem.Shortcut?

将快捷键字符串转换为MenuItem.Shortcut的实现方法

MenuItem的Shortcut是枚举类型,每个快捷键对应枚举中的一个固定值,我们可以通过解析用户输入的字符串(如"Ctrl+N"),拆分修饰键与主按键后组合出对应的枚举值,具体实现如下:

1. 核心转换逻辑

先拆分字符串中的修饰键(Ctrl/Shift/Alt)和主按键,分别映射到对应的枚举成员,再通过按位或组合最终的Shortcut值:

using System;
using System.Windows.Forms;

public static Shortcut ParseShortcutString(string shortcutStr)
{
    if (string.IsNullOrWhiteSpace(shortcutStr))
        throw new ArgumentNullException(nameof(shortcutStr));

    string[] parts = shortcutStr.Split('+', StringSplitOptions.RemoveEmptyEntries);
    if (parts.Length < 1)
        throw new FormatException("无效的快捷键格式");

    Shortcut result = Shortcut.None;
    Keys keyCode = Keys.None;

    // 处理修饰键
    foreach (string part in parts)
    {
        string trimmedPart = part.Trim().ToLowerInvariant();
        switch (trimmedPart)
        {
            case "ctrl":
            case "control":
                result |= Shortcut.Ctrl;
                break;
            case "shift":
                result |= Shortcut.Shift;
                break;
            case "alt":
                result |= Shortcut.Alt;
                break;
            default:
                // 解析主按键
                if (Enum.TryParse(trimmedPart, true, out keyCode))
                {
                    if (Enum.IsDefined(typeof(Shortcut), (int)keyCode))
                    {
                        result |= (Shortcut)(int)keyCode;
                    }
                    else
                    {
                        throw new ArgumentException($"不支持的按键:{trimmedPart}");
                    }
                }
                else
                {
                    throw new ArgumentException($"无效的按键部分:{trimmedPart}");
                }
                break;
        }
    }

    if (result == Shortcut.None)
        throw new FormatException("未找到有效的按键或修饰键");

    return result;
}

2. 使用示例

拿到用户输入的字符串后,直接调用转换方法,再赋值给MenuItem的Shortcut属性:

// 用户输入的快捷键字符串
string userInputShortcut = "Ctrl+N";
MenuItem extensionMenuItem = new MenuItem("我的扩展");

try
{
    extensionMenuItem.Shortcut = ParseShortcutString(userInputShortcut);
    // 将菜单项添加到主菜单
    mainMenu.MenuItems.Add(extensionMenuItem);
}
catch (Exception ex)
{
    // 处理输入格式错误,提示用户
    MessageBox.Show($"快捷键格式错误:{ex.Message}");
}

3. 注意事项

  • 支持的修饰键:Ctrl/Control、Shift、Alt,不区分大小写
  • 主按键支持所有MenuItem.Shortcut枚举包含的按键(如字母、数字、F1-F12、功能键等)
  • 若用户输入格式错误(如缺少主按键、包含不支持的键)会抛出异常,建议调用时添加异常处理

内容的提问来源于stack exchange,提问作者Jase

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:20:35