private void ShowProperties(IntPtr owner) => TaskUtilities.EnsureSTAThreadTask(() =>
 {
     using (var form = new Properties())
     {
         WindowsUtilities.RunForm(form, owner);
     }
 });
Esempio n. 2
0
        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);
                }
            });
        }
Esempio n. 3
0
        /// <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;
            }
        }