private void ShowProperties(IntPtr owner) => TaskUtilities.EnsureSTAThreadTask(() => { using (var form = new Properties()) { WindowsUtilities.RunForm(form, owner); } });
private void OnRootProperties(object sender, ShellMenuInvokeEventArgs e) { var ctx = ShellContext.Current.Clone(); TaskUtilities.EnsureSTAThreadTask(() => { // find the top view window handle var viewHandle = Core.WindowsShell.View.GetOwnerViewHandle(e.HwndOwner); using (var form = new RootProperties()) { form.MemoryCacheCleared += (s, e2) => { WebApi.ClearCache(); }; // use native proxy's 32x32 icon form.Icon = FolderServer.NativeProxy.Icons.FirstOrDefault(i => i.Height == 32).ToIcon(); form.SelectedObject = WebApi.ServerInfo; WindowsUtilities.RunForm(form, viewHandle); } }); }
/// <summary> /// Called when [shell menu item invoke]. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="ShellMenuInvokeEventArgs"/> instance containing the event data.</param> private async void OnShellMenuItemInvoke(object sender, ShellMenuInvokeEventArgs e) { // e.MenuItem can be null for standard commands var menu = (ShellMenu)sender; // log something (if a logger is configured) menu.Server.Configuration?.Logger?.Log(TraceLevel.Info, "Shell Item '" + e.MenuItem + "' (cmd:" + e.Command + ") called."); var mc = Conversions.ChangeType(e.MenuItem?.Tag, MenuCommand.Unknown); switch (mc) { case MenuCommand.Modify: if (e.Items.Count == 1) // we only support modification of one value at a time { // ShellBoost's implicit threads are MTA but we need an STA to show UI (with Winforms, WPF, etc.) _ = TaskUtilities.EnsureSTAThreadTask(() => { using (var form = new EditValue()) { var valueItem = (RegistryValueItem)e.Items[0]; form.LoadEditor(BaseParent.Hive, Path, valueItem.KeyName); var result = WindowsUtilities.RunForm(form); if (result == DialogResult.OK) { using (var key = OpenKey(true)) { key.SetValue(valueItem.KeyName, form.NewValue); valueItem.Parent?.NotifyUpdate(); } } } }); return; } break; case MenuCommand.NewKey: using (var key = OpenKey(true)) { if (key != null) { var newName = GetNewName("New Key #", key.GetSubKeyNames()); try { key.CreateSubKey(newName); e.Folder.RefreshShellViews(); await SelectAndEdit(newName); } catch (Exception ex) { // probably an access denied error await WindowsUtilities.DoModelessAsync(() => { MessageBox.Show(new Win32Window(e.HwndOwner), "The Registry Folder cannot set a value here: " + ex.Message, "Registry Folder", MessageBoxButtons.OK, MessageBoxIcon.Error); }); } } } break; case MenuCommand.NewValueString: case MenuCommand.NewValueBinary: case MenuCommand.NewValueDWord: case MenuCommand.NewValueQWord: case MenuCommand.NewValueMultiString: case MenuCommand.NewValueExpandString: var kind = (RegistryValueKind)mc; using (var key = OpenKey(true)) { if (key != null) { var newName = GetNewName("New Value #", key.GetValueNames()); try { key.SetValue(newName, GetDefaultValue(kind), kind); e.Folder.RefreshShellViews(); await SelectAndEdit(newName); } catch (Exception ex) { // probably an access denied error await WindowsUtilities.DoModelessAsync(() => { MessageBox.Show(new Win32Window(e.HwndOwner), "The Registry Folder cannot set a value here: " + ex.Message, "Registry Folder", MessageBoxButtons.OK, MessageBoxIcon.Error); }); } } } break; } }