diff --git a/ContextMenuManager/AppConfig.cs b/ContextMenuManager/AppConfig.cs index 5f455fb..618001e 100644 --- a/ContextMenuManager/AppConfig.cs +++ b/ContextMenuManager/AppConfig.cs @@ -33,15 +33,18 @@ namespace ContextMenuManager public static string UserDicsDir = $@"{DicsDir}\User"; public static string WebGuidInfosDic = $@"{WebDicsDir}\{GUIDINFOSDICINI}"; public static string UserGuidInfosDic = $@"{UserDicsDir}\{GUIDINFOSDICINI}"; - public static string WebThirdRulesDic = $@"{WebDicsDir}\{ThIRDRULESDICXML}"; - public static string UserThirdRulesDic = $@"{UserDicsDir}\{ThIRDRULESDICXML}"; + public static string WebThirdRulesDic = $@"{WebDicsDir}\{THIRDRULESDICXML}"; + public static string UserThirdRulesDic = $@"{UserDicsDir}\{THIRDRULESDICXML}"; public static string WebEnhanceMenusDic = $@"{WebDicsDir}\{ENHANCEMENUSICXML}"; public static string UserEnhanceMenusDic = $@"{UserDicsDir}\{ENHANCEMENUSICXML}"; + public static string WebUwpModeItemsDic = $@"{UserDicsDir}\{UWPMODEITEMSDICXML}"; + public static string UserUwpModeItemsDic = $@"{UserDicsDir}\{UWPMODEITEMSDICXML}"; public static string HashLnkExePath = $@"{ProgramsDir}\HashLnk.exe"; public const string ZH_CNINI = "zh-CN.ini"; public const string GUIDINFOSDICINI = "GuidInfosDic.ini"; - public const string ThIRDRULESDICXML = "ThirdRulesDic.xml"; + public const string THIRDRULESDICXML = "ThirdRulesDic.xml"; public const string ENHANCEMENUSICXML = "EnhanceMenusDic.xml"; + public const string UWPMODEITEMSDICXML = "UwpModeItemsDic.xml"; public static readonly string[] EngineUrls = { diff --git a/ContextMenuManager/AppDic.cs b/ContextMenuManager/AppDic.cs new file mode 100644 index 0000000..bceb575 --- /dev/null +++ b/ContextMenuManager/AppDic.cs @@ -0,0 +1,37 @@ +using BluePointLilac.Methods; +using System.IO; +using System.Xml; + +namespace ContextMenuManager +{ + static class AppDic + { + public static XmlDocument ReadXml(string webDicPath, string userDicPath, string appDic) + { + XmlDocument doc1 = new XmlDocument(); + try + { + if(File.Exists(webDicPath)) + { + doc1.LoadXml(File.ReadAllText(webDicPath, EncodingType.GetType(webDicPath))); + } + else + { + doc1.LoadXml(appDic); + } + if(File.Exists(userDicPath)) + { + XmlDocument doc2 = new XmlDocument(); + doc2.LoadXml(File.ReadAllText(userDicPath, EncodingType.GetType(userDicPath))); + foreach(XmlNode xn in doc2.DocumentElement.ChildNodes) + { + XmlNode node = doc1.ImportNode(xn, true); + doc1.DocumentElement.AppendChild(node); + } + } + } + catch { } + return doc1; + } + } +} \ No newline at end of file diff --git a/ContextMenuManager/AppImage.cs b/ContextMenuManager/AppImage.cs index 02a5175..f00151f 100644 --- a/ContextMenuManager/AppImage.cs +++ b/ContextMenuManager/AppImage.cs @@ -49,8 +49,6 @@ namespace ContextMenuManager public static readonly Image Select = Resources.Select.ResizeImage(Scale); ///Microsoft Store图标 public static readonly Image MicrosoftStore = Resources.MicrosoftStore.ResizeImage(Scale); - ///Skype图标 - public static readonly Image Skype = Resources.Skype.ResizeImage(Scale); ///dll文件默认图标 public static readonly Image DllDefaultIcon = ResourceIcon.GetExtensionIcon(".dll").ToBitmap(); ///资源不存在图标 diff --git a/ContextMenuManager/AppString.cs b/ContextMenuManager/AppString.cs index f36d409..d28452c 100644 --- a/ContextMenuManager/AppString.cs +++ b/ContextMenuManager/AppString.cs @@ -166,7 +166,6 @@ namespace ContextMenuManager public static string RemovableDrive => GetValue("RemovableDrive"); public static string BuildSendtoMenu => GetValue("BuildSendtoMenu"); public static string UseStoreOpenWith => GetValue("UseStoreOpenWith"); - public static string ShareWithSkype => GetValue("ShareWithSkype"); public static string NewItem => GetValue("NewItem"); public static string AddGuidBlockedItem => GetValue("AddGuidBlockedItem"); public static string SelectExtension => GetValue("SelectExtension"); @@ -200,7 +199,6 @@ namespace ContextMenuManager public static string MultiMenu => GetValue("MultiMenu"); public static string Public => GetValue("Public"); public static string Private => GetValue("Private"); - public static string Administrator => GetValue("Administrator"); public static string InputGuid => GetValue("InputGuid"); public static string AddGuidDic => GetValue("AddGuidDic"); public static string DeleteGuidDic => GetValue("DeleteGuidDic"); @@ -218,6 +216,7 @@ namespace ContextMenuManager public static string CheckReference => GetValue("CheckReference"); public static string CheckCopy => GetValue("CheckCopy"); public static string SelectSubMenuMode => GetValue("SelectSubMenuMode"); + public static string SelectNewItemType => GetValue("SelectNewItemType"); public static string RegistryFile => GetValue("RegistryFile"); public static string SelectGroup => GetValue("SelectGroup"); } @@ -263,13 +262,9 @@ namespace ContextMenuManager private static string GetValue(string key) => GetStringValue("Other", key); public static string RestartExplorer => GetValue("RestartExplorer"); public static string DictionaryDescription => GetValue("DictionaryDescription"); - public static string LanguageDictionary => GetValue("LanguageDictionary"); public static string GuidInfosDictionary => GetValue("GuidInfosDictionary"); - public static string ThridRulesDictionary => GetValue("ThridRulesDictionary"); - public static string CommonItemsDictionary => GetValue("CommonItemsDictionary"); public static string Translators => GetValue("Translators"); public static string OtherLanguages => GetValue("OtherLanguages"); - public static string SelectSubMenuMode => GetValue("SelectSubMenuMode"); public static string AboutApp => GetValue("AboutApp"); public static string Dictionaries => GetValue("Dictionaries"); public static string Donate => GetValue("Donate"); diff --git a/ContextMenuManager/BluePointLilac.Methods/ExternalProgram.cs b/ContextMenuManager/BluePointLilac.Methods/ExternalProgram.cs index b64144d..b4d1adc 100644 --- a/ContextMenuManager/BluePointLilac.Methods/ExternalProgram.cs +++ b/ContextMenuManager/BluePointLilac.Methods/ExternalProgram.cs @@ -12,29 +12,39 @@ namespace BluePointLilac.Methods { public static void JumpRegEdit(string regPath, string valueName = null, bool moreOpen = false) { + Process process; IntPtr hMain = FindWindow("RegEdit_RegEdit", null); - if(moreOpen || hMain == IntPtr.Zero) + if(hMain != IntPtr.Zero && !moreOpen) { - using(Process process = Process.Start("regedit.exe", "-m")) - { - process.WaitForInputIdle(); - hMain = process.MainWindowHandle; - } + GetWindowThreadProcessId(hMain, out int id); + process = Process.GetProcessById(id); + + } + else + { + process = Process.Start("regedit.exe", "-m"); + process.WaitForInputIdle(); + hMain = process.MainWindowHandle; } + ShowWindowAsync(hMain, SW_SHOWNORMAL); + SetForegroundWindow(hMain); IntPtr hTree = FindWindowEx(hMain, IntPtr.Zero, "SysTreeView32", null); IntPtr hList = FindWindowEx(hMain, IntPtr.Zero, "SysListView32", null); SetForegroundWindow(hTree); SetFocus(hTree); + process.WaitForInputIdle(); SendMessage(hTree, WM_KEYDOWN, VK_HOME, null); - Thread.Sleep(50); + Thread.Sleep(100); + process.WaitForInputIdle(); SendMessage(hTree, WM_KEYDOWN, VK_RIGHT, null); foreach(char chr in Encoding.Default.GetBytes(regPath)) { + process.WaitForInputIdle(); if(chr == '\\') { - Thread.Sleep(50); + Thread.Sleep(100); SendMessage(hTree, WM_KEYDOWN, VK_RIGHT, null); } else @@ -48,14 +58,17 @@ namespace BluePointLilac.Methods { if(key?.GetValue(valueName) == null) return; } - Thread.Sleep(50); + Thread.Sleep(100); SetForegroundWindow(hList); SetFocus(hList); + process.WaitForInputIdle(); SendMessage(hList, WM_KEYDOWN, VK_HOME, null); foreach(char chr in Encoding.Default.GetBytes(valueName)) { + process.WaitForInputIdle(); SendMessage(hList, WM_CHAR, Convert.ToInt16(chr), null); } + process.Dispose(); } public static void JumpExplorer(string filePath) @@ -130,6 +143,7 @@ namespace BluePointLilac.Methods } } + private const int SW_SHOWNORMAL = 1; private const int SW_SHOW = 5; private const uint SEE_MASK_INVOKEIDLIST = 12; private const int WM_SETTEXT = 0xC; @@ -138,12 +152,18 @@ namespace BluePointLilac.Methods private const int VK_HOME = 0x24; private const int VK_RIGHT = 0x27; + [DllImport("User32.dll")] + private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); + [DllImport("User32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("User32.dll")] private static extern bool SetFocus(IntPtr hWnd); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); + [DllImport("user32.dll")] private static extern IntPtr FindWindow(string lpszClass, string lpszWindow); diff --git a/ContextMenuManager/ContextMenuManager.csproj b/ContextMenuManager/ContextMenuManager.csproj index 2ca3501..9d0a775 100644 --- a/ContextMenuManager/ContextMenuManager.csproj +++ b/ContextMenuManager/ContextMenuManager.csproj @@ -33,7 +33,7 @@ AnyCPU true full - true + false bin\Debug\ DEBUG;TRACE prompt @@ -110,6 +110,7 @@ + Component @@ -155,6 +156,9 @@ Component + + Component + Component @@ -263,6 +267,9 @@ Component + + Component + Component @@ -331,6 +338,7 @@ + SettingsSingleFileGenerator Settings.Designer.cs @@ -361,7 +369,6 @@ - diff --git a/ContextMenuManager/Controls/AboutApp.cs b/ContextMenuManager/Controls/AboutApp.cs index fd8461d..5e663be 100644 --- a/ContextMenuManager/Controls/AboutApp.cs +++ b/ContextMenuManager/Controls/AboutApp.cs @@ -77,10 +77,10 @@ namespace ContextMenuManager.Controls readonly TabPage[] pages = new TabPage[] { new TabPage(AppString.Other.DictionaryDescription), - new TabPage(AppString.Other.LanguageDictionary), + new TabPage(AppString.SideBar.AppLanguage), new TabPage(AppString.Other.GuidInfosDictionary), - new TabPage(AppString.Other.ThridRulesDictionary), - new TabPage(AppString.Other.CommonItemsDictionary) + new TabPage(AppString.SideBar.ThirdRules), + new TabPage(AppString.SideBar.EnhanceMenu) }; readonly ReadOnlyRichTextBox[] boxs = new ReadOnlyRichTextBox[5]; readonly PictureButton btnOpenDir = new PictureButton(AppImage.Open) @@ -110,7 +110,7 @@ namespace ContextMenuManager.Controls dlg.FileName = AppConfig.GUIDINFOSDICINI; break; case 3: - dlg.FileName = AppConfig.ThIRDRULESDICXML; + dlg.FileName = AppConfig.THIRDRULESDICXML; break; case 4: dlg.FileName = AppConfig.ENHANCEMENUSICXML; @@ -437,8 +437,8 @@ namespace ContextMenuManager.Controls public void LoadItems() { - this.AddItems(new[] { mliUpdate, mliConfigDir, mliBackup, mliProtect, - mliEngine, mliWinXSortable, mliShowFilePath, mliOpenMoreRegedit }); + this.AddItems(new[] { mliUpdate, mliConfigDir, mliEngine, mliBackup, + mliProtect, mliWinXSortable, mliShowFilePath, mliOpenMoreRegedit }); cmbConfigDir.SelectedIndex = AppConfig.SaveToAppDir ? 1 : 0; chkBackup.Checked = AppConfig.AutoBackup; chkProtect.Checked = AppConfig.ProtectOpenItem; diff --git a/ContextMenuManager/Controls/AddGuidDicDialog.cs b/ContextMenuManager/Controls/AddGuidDicDialog.cs index 001f6eb..45d412b 100644 --- a/ContextMenuManager/Controls/AddGuidDicDialog.cs +++ b/ContextMenuManager/Controls/AddGuidDicDialog.cs @@ -9,7 +9,7 @@ namespace ContextMenuManager.Controls sealed class AddGuidDicDialog : CommonDialog { public Image ItemIcon { get; set; } - public string ItemName { get; set; } + public string ItemText { get; set; } public bool IsDelete { get; private set; } public string ItemIconPath { get; set; } public int ItemIconIndex { get; set; } @@ -28,14 +28,14 @@ namespace ContextMenuManager.Controls { using(AddGuidDicForm frm = new AddGuidDicForm()) { - frm.ItemName = this.ItemName; + frm.ItemText = this.ItemText; frm.ItemIcon = this.ItemIcon; frm.ItemIconPath = this.ItemIconPath; frm.ItemIconIndex = this.ItemIconIndex; bool flag = frm.ShowDialog() == DialogResult.OK; if(flag) { - this.ItemName = frm.ItemName; + this.ItemText = frm.ItemText; this.ItemIcon = frm.ItemIcon; this.ItemIconPath = frm.ItemIconPath; this.ItemIconIndex = frm.ItemIconIndex; @@ -60,7 +60,7 @@ namespace ContextMenuManager.Controls InitializeComponents(); } - public string ItemName + public string ItemText { get => txtName.Text; set => txtName.Text = value; diff --git a/ContextMenuManager/Controls/EnhanceMenusList.cs b/ContextMenuManager/Controls/EnhanceMenusList.cs index 6b68d2d..995ff6b 100644 --- a/ContextMenuManager/Controls/EnhanceMenusList.cs +++ b/ContextMenuManager/Controls/EnhanceMenusList.cs @@ -14,7 +14,9 @@ namespace ContextMenuManager.Controls { try { - foreach(XmlNode xn in ReadXml().DocumentElement.ChildNodes) + XmlDocument doc = AppDic.ReadXml(AppConfig.WebEnhanceMenusDic, + AppConfig.UserEnhanceMenusDic, Properties.Resources.EnhanceMenusDic); + foreach(XmlNode xn in doc.DocumentElement.ChildNodes) { GroupPathItem groupItem = GetGroupPathItem(xn); @@ -97,34 +99,6 @@ namespace ContextMenuManager.Controls return groupItem; } - private XmlDocument ReadXml() - { - XmlDocument doc1 = new XmlDocument(); - try - { - if(File.Exists(AppConfig.WebEnhanceMenusDic)) - { - doc1.LoadXml(File.ReadAllText(AppConfig.WebEnhanceMenusDic, EncodingType.GetType(AppConfig.WebEnhanceMenusDic))); - } - else - { - doc1.LoadXml(Properties.Resources.EnhanceMenusDic); - } - if(File.Exists(AppConfig.UserEnhanceMenusDic)) - { - XmlDocument doc2 = new XmlDocument(); - doc2.LoadXml(File.ReadAllText(AppConfig.UserEnhanceMenusDic, EncodingType.GetType(AppConfig.UserEnhanceMenusDic))); - foreach(XmlNode xn in doc2.DocumentElement.ChildNodes) - { - XmlNode node = doc1.ImportNode(xn, true); - doc1.DocumentElement.AppendChild(node); - } - } - } - catch { } - return doc1; - } - private void LoadShellItems(XmlElement shellXE, GroupPathItem groupItem) { foreach(XmlElement itemXE in shellXE.SelectNodes("Item")) diff --git a/ContextMenuManager/Controls/GuidBlockedItem.cs b/ContextMenuManager/Controls/GuidBlockedItem.cs index 66e06e5..a50c3c3 100644 --- a/ContextMenuManager/Controls/GuidBlockedItem.cs +++ b/ContextMenuManager/Controls/GuidBlockedItem.cs @@ -6,12 +6,8 @@ using System.Windows.Forms; namespace ContextMenuManager.Controls { - class GuidBlockedItem : MyListItem, IBtnDeleteItem, ITsiWebSearchItem, ITsiFilePathItem + class GuidBlockedItem : MyListItem, IBtnDeleteItem, ITsiWebSearchItem, ITsiFilePathItem, ITsiGuidItem { - public const string HKLMBLOCKED = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked"; - public const string HKCUBLOCKED = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked"; - public static readonly string[] BlockedPaths = { HKLMBLOCKED, HKCUBLOCKED }; - public GuidBlockedItem(string value) { InitializeComponents(); @@ -19,32 +15,49 @@ namespace ContextMenuManager.Controls if(GuidEx.TryParse(value, out Guid guid)) { this.Guid = guid; - this.Text = GuidInfo.GetText(guid); this.Image = GuidInfo.GetImage(guid); this.ItemFilePath = GuidInfo.GetFilePath(Guid); } else { this.Guid = Guid.Empty; - this.Text = AppString.MessageBox.MalformedGuid; this.Image = AppImage.DllDefaultIcon; } - this.Text += "\n" + value; + this.Text = this.ItemText; } public string Value { get; set; } public Guid Guid { get; set; } - public DeleteButton BtnDelete { get; set; } - public ObjectPathButton BtnOpenPath { get; set; } + public string ItemText + { + get + { + string text; + if(GuidEx.TryParse(Value, out Guid guid)) + { + text = GuidInfo.GetText(guid); + } + else + { + text = AppString.MessageBox.MalformedGuid; + } + text += "\n" + Value; + return text; + } + } + public string SearchText => Value; public string ItemFilePath { get; set; } - + public DeleteButton BtnDelete { get; set; } + public ObjectPathButton BtnOpenPath { get; set; } public WebSearchMenuItem TsiSearch { get; set; } public FileLocationMenuItem TsiFileLocation { get; set; } public FilePropertiesMenuItem TsiFileProperties { get; set; } - public string RegPath { get; set; } + public HandleGuidMenuItem TsiHandleGuid { get; set; } + + readonly ToolStripMenuItem TsiDetails = new ToolStripMenuItem(AppString.Menu.Details); private void InitializeComponents() { @@ -53,16 +66,19 @@ namespace ContextMenuManager.Controls TsiSearch = new WebSearchMenuItem(this); TsiFileProperties = new FilePropertiesMenuItem(this); TsiFileLocation = new FileLocationMenuItem(this); + TsiHandleGuid = new HandleGuidMenuItem(this, false); - ContextMenuStrip.Items.AddRange(new ToolStripItem[] {TsiSearch, - new ToolStripSeparator(), TsiFileProperties, TsiFileLocation }); + ContextMenuStrip.Items.AddRange(new ToolStripItem[] {TsiHandleGuid, + new ToolStripSeparator(), TsiDetails }); + TsiDetails.DropDownItems.AddRange(new ToolStripItem[] { TsiSearch, + new ToolStripSeparator(), TsiFileProperties, TsiFileLocation}); MyToolTip.SetToolTip(BtnDelete, AppString.Menu.Delete); } public void DeleteMe() { - Array.ForEach(BlockedPaths, path => { RegistryEx.DeleteValue(path, this.Value); }); + Array.ForEach(GuidBlockedList.BlockedPaths, path => RegistryEx.DeleteValue(path, this.Value)); if(!this.Guid.Equals(Guid.Empty)) ExplorerRestarter.Show(); this.Dispose(); } diff --git a/ContextMenuManager/Controls/GuidBlockedList.cs b/ContextMenuManager/Controls/GuidBlockedList.cs index a1f4044..4c55e20 100644 --- a/ContextMenuManager/Controls/GuidBlockedList.cs +++ b/ContextMenuManager/Controls/GuidBlockedList.cs @@ -10,6 +10,10 @@ namespace ContextMenuManager.Controls { sealed class GuidBlockedList : MyList { + public const string HKLMBLOCKED = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked"; + public const string HKCUBLOCKED = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked"; + public static readonly string[] BlockedPaths = { HKLMBLOCKED, HKCUBLOCKED }; + public void LoadItems() { this.AddNewItem(); @@ -19,15 +23,14 @@ namespace ContextMenuManager.Controls private void LoadBlockedItems() { List values = new List(); - Array.ForEach(GuidBlockedItem.BlockedPaths, path => + Array.ForEach(BlockedPaths, path => { using(RegistryKey key = RegistryEx.GetRegistryKey(path)) if(key != null) values.AddRange(key.GetValueNames()); }); Array.ForEach(values.Distinct(StringComparer.OrdinalIgnoreCase).ToArray(), value => - { - this.AddItem(new GuidBlockedItem(value)); - }); + this.AddItem(new GuidBlockedItem(value)) + ); } private void AddNewItem() @@ -42,10 +45,8 @@ namespace ContextMenuManager.Controls if(dlg.ShowDialog() != DialogResult.OK) return; if(GuidEx.TryParse(dlg.Text, out guid)) { - Array.ForEach(GuidBlockedItem.BlockedPaths, path => - { - Registry.SetValue(path, guid.ToString("B"), string.Empty); - }); + string value = guid.ToString("B"); + Array.ForEach(BlockedPaths, path => Registry.SetValue(path, value, "")); for(int i = 1; i < Controls.Count; i++) { if(((GuidBlockedItem)Controls[i]).Guid.Equals(guid)) @@ -54,7 +55,7 @@ namespace ContextMenuManager.Controls return; } } - this.InsertItem(new GuidBlockedItem(dlg.Text), 1); + this.InsertItem(new GuidBlockedItem(value), 1); ExplorerRestarter.Show(); } else MessageBoxEx.Show(AppString.MessageBox.MalformedGuid); diff --git a/ContextMenuManager/Controls/Interfaces/ITsiGuidItem.cs b/ContextMenuManager/Controls/Interfaces/ITsiGuidItem.cs new file mode 100644 index 0000000..b72b5ad --- /dev/null +++ b/ContextMenuManager/Controls/Interfaces/ITsiGuidItem.cs @@ -0,0 +1,148 @@ +using BluePointLilac.Controls; +using BluePointLilac.Methods; +using Microsoft.Win32; +using System; +using System.Windows.Forms; + +namespace ContextMenuManager.Controls.Interfaces +{ + interface ITsiGuidItem + { + Guid Guid { get; } + string ItemText { get; } + HandleGuidMenuItem TsiHandleGuid { get; set; } + } + + sealed class HandleGuidMenuItem : ToolStripMenuItem + { + public HandleGuidMenuItem(ITsiGuidItem item, bool isShellExItem) : base(AppString.Menu.HandleGuid) + { + this.Item = item; + this.DropDownItems.Add(TsiCopyGuid); + if(isShellExItem) + { + this.DropDownItems.Add(new ToolStripSeparator()); + this.DropDownItems.Add(TsiBlockGuid); + } + this.DropDownItems.Add(new ToolStripSeparator()); + this.DropDownItems.Add(TsiAddGuidDic); + TsiCopyGuid.Click += (sender, e) => CopyGuid(); + TsiBlockGuid.Click += (sender, e) => BlockGuid(); + TsiAddGuidDic.Click += (sender, e) => AddGuidDic(); + ((Control)item).ContextMenuStrip.Opening += (sender, e) => + { + TsiBlockGuid.Checked = false; + foreach(string path in GuidBlockedList.BlockedPaths) + { + if(Registry.GetValue(path, Item.Guid.ToString("B"), null) != null) + { + TsiBlockGuid.Checked = true; + break; + } + } + }; + } + + readonly ToolStripMenuItem TsiCopyGuid = new ToolStripMenuItem(AppString.Menu.CopyGuid); + readonly ToolStripMenuItem TsiBlockGuid = new ToolStripMenuItem(AppString.Menu.BlockGuid); + readonly ToolStripMenuItem TsiAddGuidDic = new ToolStripMenuItem(AppString.Menu.AddGuidDic); + + public ITsiGuidItem Item { get; set; } + + private void CopyGuid() + { + Clipboard.SetText(Item.Guid.ToString()); + MessageBoxEx.Show($"{AppString.MessageBox.CopiedToClipboard}\n{Item.Guid}", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private void BlockGuid() + { + foreach(string path in GuidBlockedList.BlockedPaths) + { + if(TsiBlockGuid.Checked) + { + RegistryEx.DeleteValue(path, Item.Guid.ToString("B")); + } + else + { + Registry.SetValue(path, Item.Guid.ToString("B"), string.Empty); + } + } + ExplorerRestarter.Show(); + } + + private void AddGuidDic() + { + using(AddGuidDicDialog dlg = new AddGuidDicDialog()) + { + dlg.ItemText = GuidInfo.GetText(Item.Guid); + dlg.ItemIcon = GuidInfo.GetImage(Item.Guid); + var location = GuidInfo.GetIconLocation(Item.Guid); + dlg.ItemIconPath = location.IconPath; + dlg.ItemIconIndex = location.IconIndex; + IniWriter writer = new IniWriter + { + FilePath = AppConfig.UserGuidInfosDic, + DeleteFileWhenEmpty = true + }; + string section = Item.Guid.ToString(); + if(dlg.ShowDialog() != DialogResult.OK) + { + if(dlg.IsDelete) + { + writer.DeleteSection(section); + GuidInfo.ItemTextDic.Remove(Item.Guid); + GuidInfo.ItemImageDic.Remove(Item.Guid); + GuidInfo.IconLocationDic.Remove(Item.Guid); + GuidInfo.UserDic.RootDic.Remove(section); + ((MyListItem)Item).Text = Item.ItemText; + ((MyListItem)Item).Image = GuidInfo.GetImage(Item.Guid); + } + return; + } + string name = ResourceString.GetDirectString(dlg.ItemText); + if(!name.IsNullOrWhiteSpace()) + { + writer.SetValue(section, "Text", dlg.ItemText); + ((MyListItem)Item).Text = name; + if(GuidInfo.ItemTextDic.ContainsKey(Item.Guid)) + { + GuidInfo.ItemTextDic[Item.Guid] = name; + } + else + { + GuidInfo.ItemTextDic.Add(Item.Guid, name); + } + } + else + { + MessageBoxEx.Show(AppString.MessageBox.StringParsingFailed); + return; + } + if(dlg.ItemIconLocation != null) + { + writer.SetValue(section, "Icon", dlg.ItemIconLocation); + location = new GuidInfo.IconLocation { IconPath = dlg.ItemIconPath, IconIndex = dlg.ItemIconIndex }; + if(GuidInfo.IconLocationDic.ContainsKey(Item.Guid)) + { + GuidInfo.IconLocationDic[Item.Guid] = location; + } + else + { + GuidInfo.IconLocationDic.Add(Item.Guid, location); + } + ((MyListItem)Item).Image = dlg.ItemIcon; + if(GuidInfo.ItemImageDic.ContainsKey(Item.Guid)) + { + GuidInfo.ItemImageDic[Item.Guid] = dlg.ItemIcon; + } + else + { + GuidInfo.ItemImageDic.Add(Item.Guid, dlg.ItemIcon); + } + } + } + } + } +} \ No newline at end of file diff --git a/ContextMenuManager/Controls/Interfaces/ITsiRegExportItem.cs b/ContextMenuManager/Controls/Interfaces/ITsiRegExportItem.cs index d8961bc..75871f5 100644 --- a/ContextMenuManager/Controls/Interfaces/ITsiRegExportItem.cs +++ b/ContextMenuManager/Controls/Interfaces/ITsiRegExportItem.cs @@ -8,7 +8,7 @@ namespace ContextMenuManager.Controls.Interfaces interface ITsiRegExportItem { string Text { get; set; } - string RegPath { get; set; } + string RegPath { get; } ContextMenuStrip ContextMenuStrip { get; set; } RegExportMenuItem TsiRegExport { get; set; } } diff --git a/ContextMenuManager/Controls/RuleItem.cs b/ContextMenuManager/Controls/RuleItem.cs index e3eaa45..f7f2871 100644 --- a/ContextMenuManager/Controls/RuleItem.cs +++ b/ContextMenuManager/Controls/RuleItem.cs @@ -149,7 +149,6 @@ namespace ContextMenuManager.Controls const string CU_SMWCE = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer"; const string LM_SPMWE = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Explorer"; const string CU_SPMWE = @"HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer"; - public const string SkypeGuid = "{776dbc8d-7347-478c-8d71-791e12ef49d8}"; public static RuleAndInfo CustomFolder = new RuleAndInfo { @@ -237,21 +236,6 @@ namespace ContextMenuManager.Controls Image = AppImage.MicrosoftStore } }; - - public static RuleAndInfo ShareWithSkype = new RuleAndInfo - { - Rules = new[] - { - new RegRule(GuidBlockedItem.HKLMBLOCKED, SkypeGuid, null, "", RegistryValueKind.String), - new RegRule(GuidBlockedItem.HKCUBLOCKED, SkypeGuid, null, "", RegistryValueKind.String) - }, - ItemInfo = new ItemInfo - { - Text = AppString.Item.ShareWithSkype, - Image = AppImage.Skype, - RestartExplorer = true - } - }; } sealed class NumberRegRuleItem : RuleItem, ITsiRegPathItem diff --git a/ContextMenuManager/Controls/ShellExItem.cs b/ContextMenuManager/Controls/ShellExItem.cs index c25d034..4eac674 100644 --- a/ContextMenuManager/Controls/ShellExItem.cs +++ b/ContextMenuManager/Controls/ShellExItem.cs @@ -8,7 +8,7 @@ using System.Windows.Forms; namespace ContextMenuManager.Controls { - sealed class ShellExItem : MyListItem, IChkVisibleItem, IBtnShowMenuItem, IFoldSubItem, + sealed class ShellExItem : MyListItem, IChkVisibleItem, IBtnShowMenuItem, IFoldSubItem, ITsiGuidItem, ITsiWebSearchItem, ITsiFilePathItem, ITsiRegPathItem, ITsiRegDeleteItem, ITsiRegExportItem { public static Dictionary GetPathAndGuids(string shellExPath, bool isDragDrop = false) @@ -68,8 +68,8 @@ namespace ContextMenuManager.Controls private string ShellExPath => RegistryEx.GetParentPath(ParentPath); private string ParentKeyName => RegistryEx.GetKeyName(ParentPath); private string DefaultValue => Registry.GetValue(RegPath, "", null)?.ToString(); - public string ItemText => GuidInfo.GetText(Guid) ?? ((Guid.ToString("B") == KeyName) ? DefaultValue : KeyName); - private GuidInfo.IconLocation IconLocation => GuidInfo.GetIconLocation(this.Guid); + public string ItemText => GuidInfo.GetText(Guid) ?? (KeyName.Equals(Guid.ToString("B"), StringComparison.OrdinalIgnoreCase) ? DefaultValue : KeyName); + private GuidInfo.IconLocation IconLocation => GuidInfo.GetIconLocation(Guid); private bool IsOpenLnkItem => Guid.ToString() == LnkOpenGuid; public bool IsDragDropItem => ParentKeyName.EndsWith(DdhParts[0], StringComparison.OrdinalIgnoreCase); @@ -114,12 +114,9 @@ namespace ContextMenuManager.Controls public DeleteMeMenuItem TsiDeleteMe { get; set; } public RegExportMenuItem TsiRegExport { get; set; } public IFoldGroupItem FoldGroupItem { get; set; } + public HandleGuidMenuItem TsiHandleGuid { get; set; } readonly ToolStripMenuItem TsiDetails = new ToolStripMenuItem(AppString.Menu.Details); - readonly ToolStripMenuItem TsiHandleGuid = new ToolStripMenuItem(AppString.Menu.HandleGuid); - readonly ToolStripMenuItem TsiCopyGuid = new ToolStripMenuItem(AppString.Menu.CopyGuid); - readonly ToolStripMenuItem TsiBlockGuid = new ToolStripMenuItem(AppString.Menu.BlockGuid); - readonly ToolStripMenuItem TsiAddGuidDic = new ToolStripMenuItem(AppString.Menu.AddGuidDic); private void InitializeComponents() { @@ -131,129 +128,15 @@ namespace ContextMenuManager.Controls TsiRegLocation = new RegLocationMenuItem(this); TsiRegExport = new RegExportMenuItem(this); TsiDeleteMe = new DeleteMeMenuItem(this); + TsiHandleGuid = new HandleGuidMenuItem(this, true); ContextMenuStrip.Items.AddRange(new ToolStripItem[] { TsiHandleGuid, new ToolStripSeparator(), TsiDetails, new ToolStripSeparator(), TsiDeleteMe }); - TsiHandleGuid.DropDownItems.AddRange(new ToolStripItem[] { TsiCopyGuid, new ToolStripSeparator(), - TsiBlockGuid, new ToolStripSeparator(), TsiAddGuidDic }); - TsiDetails.DropDownItems.AddRange(new ToolStripItem[] { TsiSearch, new ToolStripSeparator(), TsiFileProperties, TsiFileLocation, TsiRegLocation, TsiRegExport}); - ContextMenuStrip.Opening += (sender, e) => RefreshMenuItem(); - TsiCopyGuid.Click += (sender, e) => CopyGuid(); - TsiBlockGuid.Click += (sender, e) => BlockGuid(); - TsiAddGuidDic.Click += (sender, e) => AddGuidDic(); - } - - private void CopyGuid() - { - Clipboard.SetText(Guid.ToString()); - MessageBoxEx.Show($"{AppString.MessageBox.CopiedToClipboard}\n{Guid}", - MessageBoxButtons.OK, MessageBoxIcon.Information); - } - - private void BlockGuid() - { - foreach(string path in GuidBlockedItem.BlockedPaths) - { - if(TsiBlockGuid.Checked) - { - RegistryEx.DeleteValue(path, this.Guid.ToString("B")); - } - else - { - Registry.SetValue(path, this.Guid.ToString("B"), string.Empty); - } - } - ExplorerRestarter.Show(); - } - - private void AddGuidDic() - { - using(AddGuidDicDialog dlg = new AddGuidDicDialog()) - { - dlg.ItemName = this.Text; - dlg.ItemIcon = this.Image; - dlg.ItemIconPath = this.IconLocation.IconPath; - dlg.ItemIconIndex = this.IconLocation.IconIndex; - IniWriter writer = new IniWriter - { - FilePath = AppConfig.UserGuidInfosDic, - DeleteFileWhenEmpty = true - }; - string section = this.Guid.ToString(); - if(dlg.ShowDialog() != DialogResult.OK) - { - if(dlg.IsDelete) - { - writer.DeleteSection(section); - GuidInfo.ItemTextDic.Remove(this.Guid); - GuidInfo.ItemImageDic.Remove(this.Guid); - GuidInfo.IconLocationDic.Remove(this.Guid); - GuidInfo.UserDic.RootDic.Remove(section); - this.Text = this.ItemText; - this.Image = GuidInfo.GetImage(Guid); - } - return; - } - string name = ResourceString.GetDirectString(dlg.ItemName); - if(!name.IsNullOrWhiteSpace()) - { - writer.SetValue(section, "Text", dlg.ItemName); - this.Text = name; - if(GuidInfo.ItemTextDic.ContainsKey(this.Guid)) - { - GuidInfo.ItemTextDic[this.Guid] = this.Text; - } - else - { - GuidInfo.ItemTextDic.Add(this.Guid, this.Text); - } - } - else - { - MessageBoxEx.Show(AppString.MessageBox.StringParsingFailed); - return; - } - if(dlg.ItemIconLocation != null) - { - writer.SetValue(section, "Icon", dlg.ItemIconLocation); - var location = new GuidInfo.IconLocation { IconPath = dlg.ItemIconPath, IconIndex = dlg.ItemIconIndex }; - if(GuidInfo.IconLocationDic.ContainsKey(this.Guid)) - { - GuidInfo.IconLocationDic[this.Guid] = location; - } - else - { - GuidInfo.IconLocationDic.Add(this.Guid, location); - } - this.Image = dlg.ItemIcon; - if(GuidInfo.ItemImageDic.ContainsKey(this.Guid)) - { - GuidInfo.ItemImageDic[this.Guid] = this.Image; - } - else - { - GuidInfo.ItemImageDic.Add(this.Guid, this.Image); - } - } - } - } - - private void RefreshMenuItem() - { - TsiDeleteMe.Enabled = !(IsOpenLnkItem && AppConfig.ProtectOpenItem); - TsiBlockGuid.Checked = false; - foreach(string path in GuidBlockedItem.BlockedPaths) - { - if(Registry.GetValue(path, this.Guid.ToString("B"), null) != null) - { - TsiBlockGuid.Checked = true; - break; - } - } + ContextMenuStrip.Opening += (sender, e) => TsiDeleteMe.Enabled = !(IsOpenLnkItem && AppConfig.ProtectOpenItem); } private bool TryProtectOpenItem() diff --git a/ContextMenuManager/Controls/ShellList.cs b/ContextMenuManager/Controls/ShellList.cs index 910f5fc..e96246a 100644 --- a/ContextMenuManager/Controls/ShellList.cs +++ b/ContextMenuManager/Controls/ShellList.cs @@ -5,8 +5,10 @@ using Microsoft.Win32; using System; using System.Collections.Generic; using System.Drawing; +using System.IO; using System.Linq; using System.Windows.Forms; +using System.Xml; namespace ContextMenuManager.Controls { @@ -155,19 +157,9 @@ namespace ContextMenuManager.Controls } this.AddNewItem(scenePath); this.LoadItems(scenePath); + if(WindowsOsVersion.ISAfterOrEqual10) this.AddUwpModeItem(); switch(Scene) { - case Scenes.File: - bool flag = WindowsOsVersion.ISAfterOrEqual10; - if(flag) - { - using(RegistryKey key = RegistryEx.GetRegistryKey(@"HKEY_CLASSES_ROOT\PackagedCom\Package")) - { - flag = key != null && key.GetSubKeyNames().ToList().Any(name => name.StartsWith("Microsoft.SkypeApp", StringComparison.OrdinalIgnoreCase)); - } - } - if(flag) this.AddItem(new VisibleRegRuleItem(VisibleRegRuleItem.ShareWithSkype)); - break; case Scenes.Background: this.AddItem(new VisibleRegRuleItem(VisibleRegRuleItem.CustomFolder)); break; @@ -281,13 +273,14 @@ namespace ContextMenuManager.Controls newItem.AddNewItem += (sender, e) => { bool isShell; - if(Scene == Scenes.DragDrop) isShell = false; + if(Scene == Scenes.CommandStore) isShell = true; + else if(Scene == Scenes.DragDrop) isShell = false; else { using(SelectDialog dlg = new SelectDialog()) { dlg.Items = new[] { "Shell", "ShellEx" }; - dlg.Title = "请选择新建菜单类型"; + dlg.Title = AppString.Dialog.SelectNewItemType; dlg.Selected = dlg.Items[0]; if(dlg.ShowDialog() != DialogResult.OK) return; isShell = dlg.SelectedIndex == 0; @@ -310,7 +303,10 @@ namespace ContextMenuManager.Controls { if(this.Controls[i] is NewItem) { - this.InsertItem(new ShellItem(dlg.NewItemRegPath), i + 1); + ShellItem item; + if(Scene != Scenes.CommandStore) item = new ShellItem(dlg.NewItemRegPath); + else item = new StoreShellItem(dlg.NewItemRegPath, true, false); + this.InsertItem(item, i + 1); break; } } @@ -399,9 +395,33 @@ namespace ContextMenuManager.Controls { Array.ForEach(Array.FindAll(shellKey.GetSubKeyNames(), itemName => !ShellItem.SysStoreItemNames.Contains(itemName, StringComparer.OrdinalIgnoreCase)), itemName => + this.AddItem(new StoreShellItem($@"{ShellItem.CommandStorePath}\{itemName}", true, false))); + } + } + + private void AddUwpModeItem() + { + XmlDocument doc = AppDic.ReadXml(AppConfig.WebUwpModeItemsDic, + AppConfig.UserUwpModeItemsDic, Properties.Resources.UwpModeItemsDic); + List guids = new List(); + foreach(XmlElement sceneXE in doc.DocumentElement.ChildNodes) + { + if(sceneXE.Name == Scene.ToString()) + { + foreach(XmlElement itemXE in sceneXE.ChildNodes) { - this.AddItem(new StoreShellItem($@"{ShellItem.CommandStorePath}\{itemName}", true, false)); - }); + if(GuidEx.TryParse(itemXE.GetAttribute("Guid"), out Guid guid)) + { + if(guids.Contains(guid)) continue; + string uwpName = GuidInfo.GetUwpName(guid); + if(!string.IsNullOrEmpty(uwpName)) + { + this.AddItem(new UwpModeItem(uwpName, guid)); + guids.Add(guid); + } + } + } + } } } diff --git a/ContextMenuManager/Controls/ShellStoreDialog.cs b/ContextMenuManager/Controls/ShellStoreDialog.cs index ced93af..4f1730c 100644 --- a/ContextMenuManager/Controls/ShellStoreDialog.cs +++ b/ContextMenuManager/Controls/ShellStoreDialog.cs @@ -121,6 +121,8 @@ namespace ContextMenuManager.Controls if(isSelect) { this.AddCtr(chkSelected, 40.DpiZoom()); + this.ContextMenuStrip = null; + this.SetNoClickEvent(); ChkVisible.Visible = BtnShowMenu.Visible = BtnSubItems.Visible = false; } RegTrustedInstaller.TakeRegTreeOwnerShip(regPath); diff --git a/ContextMenuManager/Controls/ThirdRulesList.cs b/ContextMenuManager/Controls/ThirdRulesList.cs index aa5a6a5..8fb06b4 100644 --- a/ContextMenuManager/Controls/ThirdRulesList.cs +++ b/ContextMenuManager/Controls/ThirdRulesList.cs @@ -14,7 +14,9 @@ namespace ContextMenuManager.Controls { try { - foreach(XmlElement groupXE in ReadXml().DocumentElement.ChildNodes) + XmlDocument doc = AppDic.ReadXml(AppConfig.WebThirdRulesDic, + AppConfig.UserThirdRulesDic, Properties.Resources.ThirdRulesDic); + foreach(XmlElement groupXE in doc.DocumentElement.ChildNodes) { Guid guid = Guid.Empty; if(groupXE.HasAttribute("Guid")) @@ -164,34 +166,6 @@ namespace ContextMenuManager.Controls catch { } } - private XmlDocument ReadXml() - { - XmlDocument doc1 = new XmlDocument(); - try - { - if(File.Exists(AppConfig.WebThirdRulesDic)) - { - doc1.LoadXml(File.ReadAllText(AppConfig.WebThirdRulesDic, EncodingType.GetType(AppConfig.WebThirdRulesDic))); - } - else - { - doc1.LoadXml(Properties.Resources.ThirdRulesDic); - } - if(File.Exists(AppConfig.UserThirdRulesDic)) - { - XmlDocument doc2 = new XmlDocument(); - doc2.LoadXml(File.ReadAllText(AppConfig.UserThirdRulesDic, EncodingType.GetType(AppConfig.UserThirdRulesDic))); - foreach(XmlNode xn in doc2.DocumentElement.ChildNodes) - { - XmlNode node = doc1.ImportNode(xn, true); - doc1.DocumentElement.AppendChild(node); - } - } - } - catch { } - return doc1; - } - private static RegistryValueKind GetValueKind(string data) { switch(data.ToUpper()) diff --git a/ContextMenuManager/Controls/UwpModeItem.cs b/ContextMenuManager/Controls/UwpModeItem.cs new file mode 100644 index 0000000..f55c9fd --- /dev/null +++ b/ContextMenuManager/Controls/UwpModeItem.cs @@ -0,0 +1,136 @@ +using BluePointLilac.Controls; +using BluePointLilac.Methods; +using ContextMenuManager.Controls.Interfaces; +using Microsoft.Win32; +using System; +using System.IO; +using System.Windows.Forms; + +namespace ContextMenuManager.Controls +{ + sealed class UwpModeItem : MyListItem, IChkVisibleItem, ITsiRegPathItem, ITsiFilePathItem, + IBtnShowMenuItem, ITsiWebSearchItem, ITsiRegExportItem, ITsiRegDeleteItem, ITsiGuidItem + { + private const string PackagePath = @"HKEY_CLASSES_ROOT\PackagedCom\Package"; + private const string AppXPath = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx"; + private static readonly string WindowAppsDir = Registry.GetValue(AppXPath, "PackageRoot", null)?.ToString(); + + public UwpModeItem(string uwpName, Guid guid) + { + this.Guid = guid; + this.UwpName = uwpName; + this.InitializeComponents(); + ChkVisible.Checked = ItemVisible; + this.Visible = File.Exists(ItemFilePath); + this.Image = GuidInfo.GetImage(guid); + this.Text = this.ItemText; + } + + public Guid Guid { get; set; } + public string UwpName { get; set; } + + public bool ItemVisible + { + get + { + foreach(string path in GuidBlockedList.BlockedPaths) + { + using(RegistryKey key = RegistryEx.GetRegistryKey(path)) + { + if(key == null) continue; + if(key.GetValue(Guid.ToString("B")) != null) return false; + } + } + return true; + } + set + { + foreach(string path in GuidBlockedList.BlockedPaths) + { + if(value) + { + RegistryEx.DeleteValue(path, Guid.ToString("B")); + } + else + { + Registry.SetValue(path, Guid.ToString("B"), ""); + } + } + ExplorerRestarter.Show(); + } + } + + public string ItemText => GuidInfo.GetText(Guid); + public string RegPath => GetGuidRegPath(UwpName, Guid); + public string ItemFilePath => GetFilePath(UwpName, Guid); + + public static string GetPackageName(string uwpName) + { + using(RegistryKey packageKey = RegistryEx.GetRegistryKey(PackagePath)) + { + if(packageKey == null) return null; + foreach(string packageName in packageKey.GetSubKeyNames()) + { + if(packageName.StartsWith(uwpName, StringComparison.OrdinalIgnoreCase)) + { + return packageName; + } + } + } + return null; + } + + public static string GetGuidRegPath(string uwpName, Guid guid) + { + string packageName = GetPackageName(uwpName); + if(packageName == null) return null; + else return $@"{PackagePath}\{packageName}\Class\{guid:B}"; + } + + public static string GetFilePath(string uwpName, Guid guid) + { + string regPath = GetGuidRegPath(uwpName, guid); + if(regPath == null) return null; + string dirPath = $@"{WindowAppsDir}\{GetPackageName(uwpName)}"; + string path = Registry.GetValue(regPath, "DllPath", null)?.ToString(); + if(path.IsNullOrWhiteSpace()) return dirPath; + else return $@"{dirPath}\{path}"; + } + + public string SearchText => Text; + public string ValueName => "DllPath"; + public MenuButton BtnShowMenu { get; set; } + public VisibleCheckBox ChkVisible { get; set; } + public RegLocationMenuItem TsiRegLocation { get; set; } + public FileLocationMenuItem TsiFileLocation { get; set; } + public FilePropertiesMenuItem TsiFileProperties { get; set; } + public WebSearchMenuItem TsiSearch { get; set; } + public DeleteMeMenuItem TsiDeleteMe { get; set; } + public RegExportMenuItem TsiRegExport { get; set; } + public HandleGuidMenuItem TsiHandleGuid { get; set; } + readonly ToolStripMenuItem TsiDetails = new ToolStripMenuItem(AppString.Menu.Details); + + private void InitializeComponents() + { + BtnShowMenu = new MenuButton(this); + ChkVisible = new VisibleCheckBox(this); + TsiSearch = new WebSearchMenuItem(this); + TsiFileLocation = new FileLocationMenuItem(this); + TsiFileProperties = new FilePropertiesMenuItem(this); + TsiRegLocation = new RegLocationMenuItem(this); + TsiDeleteMe = new DeleteMeMenuItem(this); + TsiRegExport = new RegExportMenuItem(this); + TsiHandleGuid = new HandleGuidMenuItem(this, false); + this.ContextMenuStrip.Items.AddRange(new ToolStripItem[] { TsiHandleGuid, + new ToolStripSeparator(), TsiDetails, new ToolStripSeparator(), TsiDeleteMe }); + TsiDetails.DropDownItems.AddRange(new ToolStripItem[] { TsiSearch, new ToolStripSeparator(), + TsiFileProperties, TsiFileLocation, TsiRegLocation, TsiRegExport }); + } + + public void DeleteMe() + { + RegistryEx.DeleteKeyTree(this.RegPath); + this.Dispose(); + } + } +} \ No newline at end of file diff --git a/ContextMenuManager/GuidInfo.cs b/ContextMenuManager/GuidInfo.cs index dd3b3bb..d1fc8e1 100644 --- a/ContextMenuManager/GuidInfo.cs +++ b/ContextMenuManager/GuidInfo.cs @@ -24,15 +24,6 @@ namespace ContextMenuManager public int IconIndex { get; set; } } - static GuidInfo() - { - //将Skype添加到字典 - Guid skypeGuid = new Guid(VisibleRegRuleItem.SkypeGuid); - FilePathDic.Add(skypeGuid, null); - ItemTextDic.Add(skypeGuid, AppString.Item.ShareWithSkype); - ItemImageDic.Add(skypeGuid, AppImage.Skype); - } - private static readonly IniReader AppDic = new IniReader(new StringBuilder(Properties.Resources.GuidInfosDic)); public static readonly IniReader UserDic = new IniReader(AppConfig.UserGuidInfosDic); public static readonly IniReader WebDic = new IniReader(AppConfig.WebGuidInfosDic); @@ -40,10 +31,12 @@ namespace ContextMenuManager private static readonly Dictionary FilePathDic = new Dictionary(); public static readonly Dictionary ItemTextDic = new Dictionary(); public static readonly Dictionary ItemImageDic = new Dictionary(); + public static readonly Dictionary UwpNameDic = new Dictionary(); - private static bool TryGetValue(string section, string key, out string value) + private static bool TryGetValue(Guid guid, string key, out string value) { //用户自定义字典优先 + string section = guid.ToString(); if(UserDic.TryGetValue(section, key, out value)) return true; if(WebDic.TryGetValue(section, key, out value)) return true; if(AppDic.TryGetValue(section, key, out value)) return true; @@ -57,30 +50,38 @@ namespace ContextMenuManager if(FilePathDic.ContainsKey(guid)) filePath = FilePathDic[guid]; else { - foreach(string clsidPath in ClsidPaths) + string uwpName = GetUwpName(guid); + if(!string.IsNullOrEmpty(uwpName)) { - using(RegistryKey guidKey = RegistryEx.GetRegistryKey($@"{clsidPath}\{guid:B}")) + filePath = UwpModeItem.GetFilePath(uwpName, guid); + } + else + { + foreach(string clsidPath in ClsidPaths) { - if(guidKey == null) continue; - foreach(string keyName in new[] { "InprocServer32", "LocalServer32" }) + using(RegistryKey guidKey = RegistryEx.GetRegistryKey($@"{clsidPath}\{guid:B}")) { - using(RegistryKey key = guidKey.OpenSubKey(keyName)) + if(guidKey == null) continue; + foreach(string keyName in new[] { "InprocServer32", "LocalServer32" }) { - if(key == null) continue; - string value1 = key.GetValue("CodeBase")?.ToString()?.Replace("file:///", "")?.Replace('/', '\\'); - if(File.Exists(value1)) + using(RegistryKey key = guidKey.OpenSubKey(keyName)) { - filePath = value1; break; - } - string value2 = key.GetValue("")?.ToString(); - value2 = ObjectPath.ExtractFilePath(value2); - if(File.Exists(value2)) - { - filePath = value2; break; + if(key == null) continue; + string value1 = key.GetValue("CodeBase")?.ToString()?.Replace("file:///", "")?.Replace('/', '\\'); + if(File.Exists(value1)) + { + filePath = value1; break; + } + string value2 = key.GetValue("")?.ToString(); + value2 = ObjectPath.ExtractFilePath(value2); + if(File.Exists(value2)) + { + filePath = value2; break; + } } } + if(File.Exists(filePath)) break; } - if(File.Exists(filePath)) break; } } FilePathDic.Add(guid, filePath); @@ -95,7 +96,7 @@ namespace ContextMenuManager if(ItemTextDic.ContainsKey(guid)) itemText = ItemTextDic[guid]; else { - if(TryGetValue(guid.ToString(), "Text", out itemText)) + if(TryGetValue(guid, "Text", out itemText)) { itemText = GetAbsStr(guid, itemText, true); itemText = ResourceString.GetDirectString(itemText); @@ -116,7 +117,7 @@ namespace ContextMenuManager if(itemText.IsNullOrWhiteSpace()) { string filePath = GetFilePath(guid); - if(filePath != null) + if(File.Exists(filePath)) { itemText = FileVersionInfo.GetVersionInfo(filePath).FileDescription; if(itemText.IsNullOrWhiteSpace()) @@ -151,7 +152,7 @@ namespace ContextMenuManager if(IconLocationDic.ContainsKey(guid)) location = IconLocationDic[guid]; else { - if(TryGetValue(guid.ToString(), "Icon", out string value)) + if(TryGetValue(guid, "Icon", out string value)) { value = GetAbsStr(guid, value, false); int index = value.LastIndexOf(','); @@ -168,6 +169,19 @@ namespace ContextMenuManager return location; } + public static string GetUwpName(Guid guid) + { + string uwpName = null; + if(guid.Equals(Guid.Empty)) return uwpName; + if(UwpNameDic.ContainsKey(guid)) uwpName = UwpNameDic[guid]; + else + { + TryGetValue(guid, "UwpName", out uwpName); + UwpNameDic.Add(guid, uwpName); + } + return uwpName; + } + private static string GetAbsStr(Guid guid, string relStr, bool isName) { string absStr = relStr; diff --git a/ContextMenuManager/Properties/Resources.Designer.cs b/ContextMenuManager/Properties/Resources.Designer.cs index deaee76..e4082ad 100644 --- a/ContextMenuManager/Properties/Resources.Designer.cs +++ b/ContextMenuManager/Properties/Resources.Designer.cs @@ -312,16 +312,6 @@ namespace ContextMenuManager.Properties { } } - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap Skype { - get { - object obj = ResourceManager.GetObject("Skype", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// @@ -396,5 +386,20 @@ namespace ContextMenuManager.Properties { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// 查找类似 [Microsoft.SkypeApp] + ///Guid=776dbc8d-7347-478c-8d71-791e12ef49d8 + ///Scene=File + /// + ///[Microsoft.WindowsTerminal] + ///Guid=9f156763-7844-4dc4-b2b1-901f640f5155 + ///Scene=Directory|Background 的本地化字符串。 + /// + internal static string UwpModeItemsDic { + get { + return ResourceManager.GetString("UwpModeItemsDic", resourceCulture); + } + } } } diff --git a/ContextMenuManager/Properties/Resources.resx b/ContextMenuManager/Properties/Resources.resx index a560078..b947030 100644 --- a/ContextMenuManager/Properties/Resources.resx +++ b/ContextMenuManager/Properties/Resources.resx @@ -178,9 +178,6 @@ resources\images\setting.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - resources\images\skype.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - resources\images\star.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -202,4 +199,7 @@ resources\images\up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + resources\texts\uwpmodeitemsdic.xml;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + \ No newline at end of file diff --git a/ContextMenuManager/Properties/Resources/Images/Skype.png b/ContextMenuManager/Properties/Resources/Images/Skype.png deleted file mode 100644 index 84b2de0..0000000 Binary files a/ContextMenuManager/Properties/Resources/Images/Skype.png and /dev/null differ diff --git a/ContextMenuManager/Properties/Resources/Texts/AppLanguageDic.ini b/ContextMenuManager/Properties/Resources/Texts/AppLanguageDic.ini index 818abca..0549241 100644 --- a/ContextMenuManager/Properties/Resources/Texts/AppLanguageDic.ini +++ b/ContextMenuManager/Properties/Resources/Texts/AppLanguageDic.ini @@ -137,7 +137,6 @@ RecycleBinProperties = 属性(&R) RemovableDrive = 可移动磁盘 BuildSendtoMenu = 快速构建发送到子菜单 UseStoreOpenWith = 在Microsoft Store中查找应用 -ShareWithSkype = 使用 Skype 共享 NewItem = 新建一个菜单项目 AddGuidBlockedItem = 添加GUID锁定项目 LockNewMenu = 锁定新建菜单 @@ -186,6 +185,7 @@ AudioDirectory = 音频目录 CheckReference = 请勾选你想要引用的菜单项目 CheckCopy = 请勾选你想要复制的菜单项目 SelectGroup = 请选择保存分组 +SelectNewItemType = 请选择新建菜单类型 SelectSubMenuMode = 该多级菜单子项目数为0, 你有两个选择:\n①该多级菜单的所有子菜单项目私有(推荐),\n②该多级菜单可与其他多级菜单引用相同子项,\n请做出你的选择...... [MessageBox] @@ -242,10 +242,7 @@ CreateGroup = 新建一个分组 [Other] RestartExplorer = 当前部分操作需要重启文件资源管理器生效 DictionaryDescription = 字典说明 -LanguageDictionary = 程序语言 GuidInfosDictionary = GUID信息 -ThridRulesDictionary = 三方规则 -CommonItemsDictionary = 常用菜单 Translators = 翻译贡献者 OtherLanguages = 下载或上传其他语言文件 DonationList = 捐赠名单 diff --git a/ContextMenuManager/Properties/Resources/Texts/GuidInfosDic.ini b/ContextMenuManager/Properties/Resources/Texts/GuidInfosDic.ini index 3ab5ec4..5eecb90 100644 --- a/ContextMenuManager/Properties/Resources/Texts/GuidInfosDic.ini +++ b/ContextMenuManager/Properties/Resources/Texts/GuidInfosDic.ini @@ -34,7 +34,7 @@ ;----------------系统------------------ ;打开(快捷方式) [00021401-0000-0000-c000-000000000046] -Text=@shell32.dll,-12850 +Text=打开(&O) Icon=shell32.dll,-16769 ;打开文件所在的位置(&I) [37ea3a21-7493-4208-a011-7f9ea79ce9f5] @@ -594,4 +594,14 @@ Text=Directory Lister Icon=.\DirListerPro.exe [8e57c449-7891-49bb-80e5-ddac375f8ac8] Text=使用微表格打开 -Icon=.\microexcel.exe \ No newline at end of file +Icon=.\microexcel.exe + +;-------------UWP新模块---------------- +[776dbc8d-7347-478c-8d71-791e12ef49d8] +UwpName=Microsoft.SkypeApp +Text=@*,-101 +Icon=.\Skype.exe +[9F156763-7844-4DC4-B2B1-901F640F5155] +UwpName=Microsoft.WindowsTerminal +Text=Open in Windows Terminal +Icon=.\WindowsTerminal.exe \ No newline at end of file diff --git a/ContextMenuManager/Properties/Resources/Texts/UwpModeItemsDic.xml b/ContextMenuManager/Properties/Resources/Texts/UwpModeItemsDic.xml new file mode 100644 index 0000000..d8833e6 --- /dev/null +++ b/ContextMenuManager/Properties/Resources/Texts/UwpModeItemsDic.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ContextMenuManager/Updater.cs b/ContextMenuManager/Updater.cs index 41df508..c87560a 100644 --- a/ContextMenuManager/Updater.cs +++ b/ContextMenuManager/Updater.cs @@ -13,6 +13,7 @@ namespace ContextMenuManager const string GuidInfosDicUrl = "https://gitee.com/BluePointLilac/ContextMenuManager/raw/master/ContextMenuManager/Properties/Resources/Texts/GuidInfosDic.ini"; const string ThirdRulesDicUrl = "https://gitee.com/BluePointLilac/ContextMenuManager/raw/master/ContextMenuManager/Properties/Resources/Texts/ThirdRulesDic.xml"; const string EnhanceMenusDicUrl = "https://gitee.com/BluePointLilac/ContextMenuManager/raw/master/ContextMenuManager/Properties/Resources/Texts/EnhanceMenusDic.xml"; + const string UwpModeItemsDicUrl = "https://gitee.com/BluePointLilac/ContextMenuManager/raw/master/ContextMenuManager/Properties/Resources/Texts/UwpModeItemsDic.xml"; public static void PeriodicUpdate() { @@ -34,6 +35,7 @@ namespace ContextMenuManager UpdateText(AppConfig.WebGuidInfosDic, GuidInfosDicUrl); UpdateText(AppConfig.WebThirdRulesDic, ThirdRulesDicUrl); UpdateText(AppConfig.WebEnhanceMenusDic, EnhanceMenusDicUrl); + UpdateText(AppConfig.WebUwpModeItemsDic, UwpModeItemsDicUrl); try { return UpdateApp(); } catch { return false; } } diff --git a/Screenshot.png b/Screenshot.png index 80ec731..8b065a2 100644 Binary files a/Screenshot.png and b/Screenshot.png differ diff --git a/languages/zh-CN.ini b/languages/zh-CN.ini index 818abca..0549241 100644 --- a/languages/zh-CN.ini +++ b/languages/zh-CN.ini @@ -137,7 +137,6 @@ RecycleBinProperties = 属性(&R) RemovableDrive = 可移动磁盘 BuildSendtoMenu = 快速构建发送到子菜单 UseStoreOpenWith = 在Microsoft Store中查找应用 -ShareWithSkype = 使用 Skype 共享 NewItem = 新建一个菜单项目 AddGuidBlockedItem = 添加GUID锁定项目 LockNewMenu = 锁定新建菜单 @@ -186,6 +185,7 @@ AudioDirectory = 音频目录 CheckReference = 请勾选你想要引用的菜单项目 CheckCopy = 请勾选你想要复制的菜单项目 SelectGroup = 请选择保存分组 +SelectNewItemType = 请选择新建菜单类型 SelectSubMenuMode = 该多级菜单子项目数为0, 你有两个选择:\n①该多级菜单的所有子菜单项目私有(推荐),\n②该多级菜单可与其他多级菜单引用相同子项,\n请做出你的选择...... [MessageBox] @@ -242,10 +242,7 @@ CreateGroup = 新建一个分组 [Other] RestartExplorer = 当前部分操作需要重启文件资源管理器生效 DictionaryDescription = 字典说明 -LanguageDictionary = 程序语言 GuidInfosDictionary = GUID信息 -ThridRulesDictionary = 三方规则 -CommonItemsDictionary = 常用菜单 Translators = 翻译贡献者 OtherLanguages = 下载或上传其他语言文件 DonationList = 捐赠名单