diff --git a/ContextMenuManager/BluePointLilac.Methods/ResourceString.cs b/ContextMenuManager/BluePointLilac.Methods/ResourceString.cs
index 6d9a45d6..23b1af2b 100644
--- a/ContextMenuManager/BluePointLilac.Methods/ResourceString.cs
+++ b/ContextMenuManager/BluePointLilac.Methods/ResourceString.cs
@@ -24,5 +24,33 @@ public static string GetDirectString(string resStr)
SHLoadIndirectString(resStr, outBuff, 1024, IntPtr.Zero);
return outBuff.ToString();
}
+
+ /// Strips Win32 menu access-key markers so the list matches what Explorer actually renders.
+ /// The raw menu text, typically read from the registry.
+ /// The input unchanged when the setting is off or no '&' is present; otherwise the text with single '&' removed and '&&' collapsed to a literal '&'.
+ /// Leaving the setting off preserves the raw registry text for power users who want to see the mnemonic markers.
+ public static string StripMnemonics(string text)
+ {
+ if (string.IsNullOrEmpty(text) || !AppConfig.StripMenuMnemonics) return text;
+ if (text.IndexOf('&') < 0) return text;
+
+ var sb = new StringBuilder(text.Length);
+ for (var i = 0; i < text.Length; i++)
+ {
+ if (text[i] == '&')
+ {
+ if (i + 1 < text.Length && text[i + 1] == '&')
+ {
+ sb.Append('&');
+ i++;
+ }
+ }
+ else
+ {
+ sb.Append(text[i]);
+ }
+ }
+ return sb.ToString();
+ }
}
}
diff --git a/ContextMenuManager/Controls/DetailedEditDialog.cs b/ContextMenuManager/Controls/DetailedEditDialog.cs
index 3826f084..4ab23c63 100644
--- a/ContextMenuManager/Controls/DetailedEditDialog.cs
+++ b/ContextMenuManager/Controls/DetailedEditDialog.cs
@@ -15,7 +15,7 @@ public bool ShowDialog()
public bool RunDialog(MainWindow owner)
{
var dialog = ContentDialogHost.CreateDialog(
- AppString.Dialog.DetailedEdit.Replace("%s", GuidInfo.GetText(GroupGuid)),
+ AppString.Dialog.DetailedEdit.Replace("%s", ResourceString.StripMnemonics(GuidInfo.GetText(GroupGuid))),
owner);
var list = new DetailedEditList
diff --git a/ContextMenuManager/Controls/DetailedEditList.cs b/ContextMenuManager/Controls/DetailedEditList.cs
index 4dcd2478..c337e208 100644
--- a/ContextMenuManager/Controls/DetailedEditList.cs
+++ b/ContextMenuManager/Controls/DetailedEditList.cs
@@ -43,12 +43,12 @@ public override void LoadItems()
groupItem = new FoldGroupItem(this, groupXN.SelectSingleNode(attribute)?.InnerText, pathType);
foreach (XmlElement textXE in groupXN.SelectNodes("Text"))
{
- if (XmlDicHelper.JudgeCulture(textXE)) groupItem.Text = ResourceString.GetDirectString(textXE.GetAttribute("Value"));
+ if (XmlDicHelper.JudgeCulture(textXE)) groupItem.Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(textXE.GetAttribute("Value")));
}
if (guids.Count > 0)
{
groupItem.Control.Tag = guids;
- if (string.IsNullOrWhiteSpace(groupItem.Text)) groupItem.Text = GuidInfo.GetText(guids[0]);
+ if (string.IsNullOrWhiteSpace(groupItem.Text)) groupItem.Text = ResourceString.StripMnemonics(GuidInfo.GetText(guids[0]));
groupItem.Image = GuidInfo.GetImage(guids[0]);
var filePath = GuidInfo.GetFilePath(guids[0]);
var clsidPath = GuidInfo.GetClsidPath(guids[0]);
@@ -95,7 +95,7 @@ string GetRuleFullRegPath(string regPath)
// 获取文本、提示文本
foreach (XmlElement textXE in itemXE.SelectNodes("Text"))
{
- if (XmlDicHelper.JudgeCulture(textXE)) info.Text = ResourceString.GetDirectString(textXE.GetAttribute("Value"));
+ if (XmlDicHelper.JudgeCulture(textXE)) info.Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(textXE.GetAttribute("Value")));
}
foreach (XmlElement tipXE in itemXE.SelectNodes("Tip"))
{
diff --git a/ContextMenuManager/Controls/EnhanceMenuList.cs b/ContextMenuManager/Controls/EnhanceMenuList.cs
index 85af08f3..3b5b8ba2 100644
--- a/ContextMenuManager/Controls/EnhanceMenuList.cs
+++ b/ContextMenuManager/Controls/EnhanceMenuList.cs
@@ -26,7 +26,7 @@ public override void LoadItems()
{
if (XmlDicHelper.JudgeCulture(textXE))
{
- text = ResourceString.GetDirectString(textXE.GetAttribute("Value"));
+ text = ResourceString.StripMnemonics(ResourceString.GetDirectString(textXE.GetAttribute("Value")));
}
}
if (string.IsNullOrEmpty(path) || string.IsNullOrEmpty(text)) continue;
@@ -72,7 +72,7 @@ private void LoadShellItems(XmlNode shellXN, FoldGroupItem groupItem)
foreach (XmlElement szXE in itemXE.SelectNodes("Value/REG_SZ"))
{
if (!XmlDicHelper.JudgeCulture(szXE)) continue;
- if (szXE.HasAttribute("MUIVerb")) item.Text = ResourceString.GetDirectString(szXE.GetAttribute("MUIVerb"));
+ if (szXE.HasAttribute("MUIVerb")) item.Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(szXE.GetAttribute("MUIVerb")));
if (szXE.HasAttribute("Icon")) item.Image = ResourceIcon.GetIcon(szXE.GetAttribute("Icon"))?.ToBitmap();
else if (szXE.HasAttribute("HasLUAShield")) item.Image = AppImage.Shield;
}
@@ -101,7 +101,7 @@ private void LoadShellItems(XmlNode shellXN, FoldGroupItem groupItem)
}
}
item.Image ??= AppImage.NotFound;
- if (string.IsNullOrWhiteSpace(item.Text)) item.Text = keyName;
+ if (string.IsNullOrWhiteSpace(item.Text)) item.Text = ResourceString.StripMnemonics(keyName);
var tip = "";
foreach (XmlElement tipXE in itemXE.SelectNodes("Tip"))
{
@@ -137,10 +137,10 @@ private void LoadShellExItems(XmlNode shellExXN, FoldGroupItem groupItem)
{
if (XmlDicHelper.JudgeCulture(textXE))
{
- item.Text = ResourceString.GetDirectString(textXE.InnerText);
+ item.Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(textXE.InnerText));
}
}
- if (string.IsNullOrWhiteSpace(item.Text)) item.Text = GuidInfo.GetText(guid);
+ if (string.IsNullOrWhiteSpace(item.Text)) item.Text = ResourceString.StripMnemonics(GuidInfo.GetText(guid));
if (string.IsNullOrWhiteSpace(item.DefaultKeyName)) item.DefaultKeyName = guid.ToString("B");
var tip = "";
foreach (XmlElement tipXE in itemXN.SelectNodes("Tip"))
diff --git a/ContextMenuManager/Controls/GuidBlockedItem.cs b/ContextMenuManager/Controls/GuidBlockedItem.cs
index ef88295f..6ff20a10 100644
--- a/ContextMenuManager/Controls/GuidBlockedItem.cs
+++ b/ContextMenuManager/Controls/GuidBlockedItem.cs
@@ -38,7 +38,7 @@ public GuidBlockedItem(GuidBlockedList list, string value) : base(list)
if (list != null) Image = AppImage.SystemFile;
}
- Text = ItemText;
+ Text = ResourceString.StripMnemonics(ItemText);
}
public string Value { get; set; }
diff --git a/ContextMenuManager/Controls/IEItem.cs b/ContextMenuManager/Controls/IEItem.cs
index be72fc93..fb64c16e 100644
--- a/ContextMenuManager/Controls/IEItem.cs
+++ b/ContextMenuManager/Controls/IEItem.cs
@@ -31,7 +31,7 @@ public string RegPath
set
{
regPath = value;
- Text = ItemText;
+ Text = ResourceString.StripMnemonics(ItemText);
if (List != null) Image = ItemImage;
}
}
diff --git a/ContextMenuManager/Controls/Interfaces/ITsiGuidItem.cs b/ContextMenuManager/Controls/Interfaces/ITsiGuidItem.cs
index 11453117..75369795 100644
--- a/ContextMenuManager/Controls/Interfaces/ITsiGuidItem.cs
+++ b/ContextMenuManager/Controls/Interfaces/ITsiGuidItem.cs
@@ -96,7 +96,7 @@ private void AddGuidDic()
{
writer.DeleteSection(section);
GuidInfo.RemoveDic(Item.Guid);
- listItem.Text = Item.ItemText;
+ listItem.Text = ResourceString.StripMnemonics(Item.ItemText);
listItem.Image = GuidInfo.GetImage(Item.Guid);
}
return;
@@ -117,7 +117,7 @@ private void AddGuidDic()
GuidInfo.RemoveDic(Item.Guid);
writer.SetValue(section, "Text", dlg.ItemText);
writer.SetValue(section, "Icon", dlg.ItemIconLocation);
- listItem.Text = dlg.ItemText;
+ listItem.Text = ResourceString.StripMnemonics(dlg.ItemText);
listItem.Image = dlg.ItemIcon;
}
}
diff --git a/ContextMenuManager/Controls/Interfaces/ITsiTextItem.cs b/ContextMenuManager/Controls/Interfaces/ITsiTextItem.cs
index 6ce8eb02..69bd0bbb 100644
--- a/ContextMenuManager/Controls/Interfaces/ITsiTextItem.cs
+++ b/ContextMenuManager/Controls/Interfaces/ITsiTextItem.cs
@@ -15,7 +15,7 @@ public ChangeTextMenuItem(ITsiTextItem item) : base(AppString.Menu.ChangeText)
{
Click += (sender, e) =>
{
- var name = ChangeText(item.Text);
+ var name = ChangeText(item.ItemText ?? item.Text);
if (name != null) item.ItemText = name;
};
}
diff --git a/ContextMenuManager/Controls/OpenWithItem.cs b/ContextMenuManager/Controls/OpenWithItem.cs
index 948f099c..aa129fa4 100644
--- a/ContextMenuManager/Controls/OpenWithItem.cs
+++ b/ContextMenuManager/Controls/OpenWithItem.cs
@@ -33,7 +33,7 @@ public string RegPath
{
regPath = value;
ItemFilePath = ObjectPath.ExtractFilePath(ItemCommand);
- Text = ItemText;
+ Text = ResourceString.StripMnemonics(ItemText);
if (List != null) Image = ItemIcon.ToBitmap();
}
}
@@ -60,7 +60,7 @@ public string ItemText
set
{
Registry.SetValue(AppPath, "FriendlyAppName", value);
- Text = ResourceString.GetDirectString(value);
+ Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(value));
}
}
diff --git a/ContextMenuManager/Controls/RuleItem.cs b/ContextMenuManager/Controls/RuleItem.cs
index 725f91ca..ec648e13 100644
--- a/ContextMenuManager/Controls/RuleItem.cs
+++ b/ContextMenuManager/Controls/RuleItem.cs
@@ -16,7 +16,7 @@ public RuleItem(MyList list, ItemInfo info) : base(list)
RestartExplorer = info.RestartExplorer;
if (list != null)
{
- Text = info.Text;
+ Text = ResourceString.StripMnemonics(info.Text);
Image = info.Image;
BtnShowMenu = new MenuButton(this);
TsiSearch = new WebSearchMenuItem(this);
diff --git a/ContextMenuManager/Controls/SendToItem.cs b/ContextMenuManager/Controls/SendToItem.cs
index 73850ac3..5ac5a22d 100644
--- a/ContextMenuManager/Controls/SendToItem.cs
+++ b/ContextMenuManager/Controls/SendToItem.cs
@@ -26,7 +26,7 @@ public string FilePath
{
filePath = value;
if (IsShortcut) ShellLink = new ShellLink(value);
- Text = ItemText;
+ Text = ResourceString.StripMnemonics(ItemText);
if (List != null) Image = ItemImage;
}
}
@@ -90,7 +90,7 @@ public string ItemText
set
{
DesktopIni.SetLocalizedFileNames(FilePath, value);
- Text = ResourceString.GetDirectString(value);
+ Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(value));
ExplorerRestarter.Show();
}
}
diff --git a/ContextMenuManager/Controls/ShellExItem.cs b/ContextMenuManager/Controls/ShellExItem.cs
index d1cfdf93..f1361cdf 100644
--- a/ContextMenuManager/Controls/ShellExItem.cs
+++ b/ContextMenuManager/Controls/ShellExItem.cs
@@ -65,7 +65,7 @@ public string RegPath
set
{
regPath = value;
- Text = ItemText;
+ Text = ResourceString.StripMnemonics(ItemText);
if (List != null) Image = GuidInfo.GetImage(Guid);
}
}
diff --git a/ContextMenuManager/Controls/ShellItem.cs b/ContextMenuManager/Controls/ShellItem.cs
index 762bf309..c60d1b66 100644
--- a/ContextMenuManager/Controls/ShellItem.cs
+++ b/ContextMenuManager/Controls/ShellItem.cs
@@ -48,7 +48,7 @@ public string RegPath
set
{
regPath = value;
- Text = ItemText;
+ Text = ResourceString.StripMnemonics(ItemText);
if (List != null)
{
Image = ItemIcon.ToBitmap();
@@ -275,7 +275,7 @@ public string ItemText
else
{
Registry.SetValue(RegPath, "MUIVerb", value);
- Text = ResourceString.GetDirectString(value);
+ Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(value));
}
}
}
diff --git a/ContextMenuManager/Controls/ShellNewItem.cs b/ContextMenuManager/Controls/ShellNewItem.cs
index a9107278..962adfce 100644
--- a/ContextMenuManager/Controls/ShellNewItem.cs
+++ b/ContextMenuManager/Controls/ShellNewItem.cs
@@ -68,7 +68,7 @@ public string RegPath
set
{
regPath = value;
- Text = ItemText;
+ Text = ResourceString.StripMnemonics(ItemText);
if (List != null) Image = ItemIcon.ToBitmap();
}
}
@@ -141,7 +141,7 @@ public string ItemText
{
RegistryEx.DeleteValue(RegPath, "MenuText");
Registry.SetValue(DefaultOpenModePath, "FriendlyTypeName", value);
- Text = ResourceString.GetDirectString(value);
+ Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(value));
}
}
diff --git a/ContextMenuManager/Controls/UwpModeItem.cs b/ContextMenuManager/Controls/UwpModeItem.cs
index c213e909..80e2dac4 100644
--- a/ContextMenuManager/Controls/UwpModeItem.cs
+++ b/ContextMenuManager/Controls/UwpModeItem.cs
@@ -19,7 +19,7 @@ public UwpModeItem(MyList list, string uwpName, Guid guid) : base(list)
{
Guid = guid;
UwpName = uwpName;
- Text = ItemText;
+ Text = ResourceString.StripMnemonics(ItemText);
if (list != null)
{
InitializeComponents();
diff --git a/ContextMenuManager/Controls/WinXItem.cs b/ContextMenuManager/Controls/WinXItem.cs
index 8fc9e415..f4c08ff1 100644
--- a/ContextMenuManager/Controls/WinXItem.cs
+++ b/ContextMenuManager/Controls/WinXItem.cs
@@ -40,7 +40,7 @@ public string FilePath
{
filePath = value;
ShellLink = new ShellLink(value);
- Text = ItemText;
+ Text = ResourceString.StripMnemonics(ItemText);
if (List != null) Image = ItemImage;
}
}
@@ -86,7 +86,7 @@ public string ItemText
{
DesktopIni.SetLocalizedFileNames(FilePath, value);
}
- Text = ResourceString.GetDirectString(value);
+ Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(value));
ExplorerRestarter.Show();
}
}
diff --git a/ContextMenuManager/Methods/AppConfig.cs b/ContextMenuManager/Methods/AppConfig.cs
index 54cefe51..64f9c4f7 100644
--- a/ContextMenuManager/Methods/AppConfig.cs
+++ b/ContextMenuManager/Methods/AppConfig.cs
@@ -285,6 +285,12 @@ public static bool HideSysStoreItems
set => SetGeneralValue("HideSysStoreItems", value ? 1 : 0);
}
+ public static bool StripMenuMnemonics
+ {
+ get => GetGeneralValue("StripMenuMnemonics") == "1";
+ set => SetGeneralValue("StripMenuMnemonics", value ? 1 : 0);
+ }
+
public static bool DimInferredIcons
{
get => GetGeneralValue("DimInferredIcons") != "0";
diff --git a/ContextMenuManager/Methods/AppString.cs b/ContextMenuManager/Methods/AppString.cs
index f49433f3..3d555efc 100644
--- a/ContextMenuManager/Methods/AppString.cs
+++ b/ContextMenuManager/Methods/AppString.cs
@@ -378,6 +378,7 @@ public static class Other
public static string OpenMoreExplorer { get; set; }
public static string HideDisabledItems { get; set; }
public static string HideSysStoreItems { get; set; }
+ public static string StripMenuMnemonics { get; set; }
public static string DimInferredIcons { get; set; }
public static string SetPerceivedType { get; set; }
public static string SetDefaultDropEffect { get; set; }
diff --git a/ContextMenuManager/Properties/Resources/Texts/AppLanguageDic.ini b/ContextMenuManager/Properties/Resources/Texts/AppLanguageDic.ini
index ccce4b26..27c06745 100644
--- a/ContextMenuManager/Properties/Resources/Texts/AppLanguageDic.ini
+++ b/ContextMenuManager/Properties/Resources/Texts/AppLanguageDic.ini
@@ -324,6 +324,7 @@ CustomEngine = 自定义
SetCustomEngine = 设置搜索引擎 (以 %s 代替搜索关键词)
HideDisabledItems = 隐藏已禁用的菜单项目
HideSysStoreItems = 隐藏公共引用中的系统菜单
+StripMenuMnemonics = 隐藏菜单项名称中的快捷键符号(&)
DimInferredIcons = 对推测的图标使用半透明效果
SetPerceivedType = 设置扩展名为 %s 的文件感知类型为
SetDefaultDropEffect = 设置文件对象默认拖拽命令为
diff --git a/ContextMenuManager/Views/AppSettingView.xaml b/ContextMenuManager/Views/AppSettingView.xaml
index 3f520151..2aaa643f 100644
--- a/ContextMenuManager/Views/AppSettingView.xaml
+++ b/ContextMenuManager/Views/AppSettingView.xaml
@@ -296,7 +296,7 @@
-
+
@@ -315,7 +315,28 @@
Toggled="HideSysStoreItemsCheckBox_OnChanged" />
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ContextMenuManager/Views/AppSettingView.xaml.cs b/ContextMenuManager/Views/AppSettingView.xaml.cs
index d548a754..1454773b 100644
--- a/ContextMenuManager/Views/AppSettingView.xaml.cs
+++ b/ContextMenuManager/Views/AppSettingView.xaml.cs
@@ -40,6 +40,7 @@ public void RefreshFromConfig()
OpenMoreExplorerCheckBox.IsOn = AppConfig.OpenMoreExplorer;
HideDisabledItemsCheckBox.IsOn = AppConfig.HideDisabledItems;
HideSysStoreItemsCheckBox.IsOn = AppConfig.HideSysStoreItems;
+ StripMenuMnemonicsCheckBox.IsOn = AppConfig.StripMenuMnemonics;
DimInferredIconsCheckBox.IsOn = AppConfig.DimInferredIcons;
var showHideSysStore = WinOsVersion.Current >= WinOsVersion.Win7;
@@ -111,6 +112,8 @@ private void LoadLabels()
HideSysStoreItemsLabel.Text = AppString.Other.HideSysStoreItems;
+ StripMenuMnemonicsLabel.Text = AppString.Other.StripMenuMnemonics;
+
DimInferredIconsLabel.Text = AppString.Other.DimInferredIcons;
LoadDynamicOptions();
@@ -285,6 +288,14 @@ private void HideSysStoreItemsCheckBox_OnChanged(object sender, RoutedEventArgs
}
}
+ private void StripMenuMnemonicsCheckBox_OnChanged(object sender, RoutedEventArgs e)
+ {
+ if (!isLoading)
+ {
+ AppConfig.StripMenuMnemonics = StripMenuMnemonicsCheckBox.IsOn;
+ }
+ }
+
private void DimInferredIconsCheckBox_OnChanged(object sender, RoutedEventArgs e)
{
if (!isLoading)
diff --git a/languages/en-US.ini b/languages/en-US.ini
index 5b651135..bbb26417 100644
--- a/languages/en-US.ini
+++ b/languages/en-US.ini
@@ -328,6 +328,7 @@ CustomEngine = Custom...
SetCustomEngine = Define search engine (use %s instead of search keywords)
HideDisabledItems = Hide disabled items
HideSysStoreItems = Hide system store items
+StripMenuMnemonics = Hide access-key markers (&) in menu item names
DimInferredIcons = Dim icons inferred from the item's command
SetPerceivedType = Set %s perceived type...
SetDefaultDropEffect = Set default drop effect
diff --git a/languages/zh-CN.ini b/languages/zh-CN.ini
index ccce4b26..27c06745 100644
--- a/languages/zh-CN.ini
+++ b/languages/zh-CN.ini
@@ -324,6 +324,7 @@ CustomEngine = 自定义
SetCustomEngine = 设置搜索引擎 (以 %s 代替搜索关键词)
HideDisabledItems = 隐藏已禁用的菜单项目
HideSysStoreItems = 隐藏公共引用中的系统菜单
+StripMenuMnemonics = 隐藏菜单项名称中的快捷键符号(&)
DimInferredIcons = 对推测的图标使用半透明效果
SetPerceivedType = 设置扩展名为 %s 的文件感知类型为
SetDefaultDropEffect = 设置文件对象默认拖拽命令为