WinExec() private method

private WinExec ( string lpCmdLine, int uCmdShow ) : uint
lpCmdLine string
uCmdShow int
return uint
Beispiel #1
0
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.UnhandledException += (o, e) =>
            {
                MessageBox.Show(e.ExceptionObject.ToString(), "发生错误!");
            };

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            List <UinstallItem> itemList = PrepareUinstallList();

            Form form = new Form();

            form.Text          = "软件卸载助手 v1.0";
            form.Size          = new Size(800, 500);
            form.StartPosition = FormStartPosition.CenterScreen;

            DataGridView grid = new DataGridView();

            grid.Dock                     = DockStyle.Fill;
            grid.ReadOnly                 = true;
            grid.SelectionMode            = DataGridViewSelectionMode.FullRowSelect;
            grid.MultiSelect              = false;
            grid.AutoSizeColumnsMode      = DataGridViewAutoSizeColumnsMode.None;
            grid.RowHeadersVisible        = false;
            grid.AllowUserToResizeRows    = false;
            grid.AllowUserToResizeColumns = false;
            grid.CellBorderStyle          = DataGridViewCellBorderStyle.RaisedHorizontal;
            grid.DataSource               = itemList;
            form.Controls.Add(grid);

            StatusStrip statusBar = new StatusStrip();

            statusBar.Dock = DockStyle.Bottom;
            form.Controls.Add(statusBar);

            ToolStripStatusLabel statusLabelItemCnt = new ToolStripStatusLabel();

            statusLabelItemCnt.TextAlign   = ContentAlignment.MiddleLeft;
            statusLabelItemCnt.Width       = 90;
            statusLabelItemCnt.BorderSides = ToolStripStatusLabelBorderSides.All;
            statusBar.Items.Add(statusLabelItemCnt);
            ToolStripStatusLabel statusLabelSearchStr = new ToolStripStatusLabel();

            statusLabelSearchStr.Spring    = true;
            statusLabelSearchStr.TextAlign = ContentAlignment.MiddleLeft;
            statusBar.Items.Add(statusLabelSearchStr);

            // 单击列头,排序
            bool ascendingSort = true;

            grid.ColumnHeaderMouseClick += (o, e) =>
            {
                var column = grid.Columns[e.ColumnIndex];

                {
                    Type t = column.ValueType;
                    if (t.IsGenericType && t.GetGenericTypeDefinition().FullName == "System.Nullable`1")
                    {
                        t = t.GetGenericArguments()[0];
                    }
                    if (t.GetInterface("IComparable") == null)
                    {
                        return;
                    }
                }

                grid.ScrollBars = ScrollBars.None;
                grid.DataSource = null;
                ascendingSort   = !ascendingSort;
                var fGet = MakeGetPropertyFunc(typeof(UinstallItem).GetProperty(column.DataPropertyName));
                itemList.Sort((x, y) =>
                {
                    int r       = 0;
                    object valX = fGet(x);
                    object valY = fGet(y);
                    if (valX == null && valY == null)
                    {
                        r = 0;
                    }
                    else if (valX == null)
                    {
                        r = -1;
                    }
                    else if (valY == null)
                    {
                        r = 1;
                    }
                    else
                    {
                        r = (valX as IComparable).CompareTo(valY);
                    }
                    return(ascendingSort ? r : -r);
                });
                grid.DataSource = itemList;
                grid.ScrollBars = ScrollBars.Both;
            };

            // 控制显示的列数
            int    visibleColumn        = 4;
            Action adjustGridColumnFunc = () =>
            {
                for (int i = 0; i < grid.Columns.Count; ++i)
                {
                    var column = grid.Columns[i];
                    column.Width =
                        (typeof(UinstallItem).GetProperty(column.DataPropertyName).
                         GetCustomAttributes(typeof(DisplayWidth), false)[0] as DisplayWidth).Width;
                    column.Visible = i < visibleColumn;
                }
            };

            grid.DataBindingComplete += (o, e) =>
            {
                adjustGridColumnFunc();
                statusLabelItemCnt.Text = string.Format("共有{0}个项目", itemList.Count);
            };

            // 右键菜单
            ContextMenuStrip contextMenu = new ContextMenuStrip();

            contextMenu.Items.Add("详细信息").Click += (o, e) =>
            {
                visibleColumn = 104 - visibleColumn;
                adjustGridColumnFunc();
            };
            contextMenu.Items.Add(string.Format(AppConfig.BrowseWow64 ? "兼容软件" : "非兼容软件")).Click += (o, e) =>
            {
                AppConfig.BrowseWow64 = !AppConfig.BrowseWow64;
                Win32Import.WinExec(Environment.CommandLine, 5);
                form.Close();
            };
            contextMenu.Items.Add("关于").Click += (o, e) =>
            {
                MessageBox.Show("Scan制作!", "关于");
            };
            MouseEventHandler mouseHandlerShowMenu = (o, e) =>
            {
                if (e.Button == MouseButtons.Right)
                {
                    contextMenu.Show(grid, e.Location);
                }
            };

            grid.MouseClick += mouseHandlerShowMenu;
            form.MouseClick += mouseHandlerShowMenu;

            // 输入定位; 包括把form和grid的输入字符都交给输入框
            TextBox searchTextBox = new TextBox();

            searchTextBox.Location     = new Point(-5, -5);
            searchTextBox.Size         = new Size(1, 1);
            searchTextBox.ImeMode      = ImeMode.On;
            searchTextBox.TextChanged += (o, e) =>
            {
                statusLabelSearchStr.Text = "";
                if (string.IsNullOrEmpty(searchTextBox.Text))
                {
                    return;
                }
                statusLabelSearchStr.Text = string.Format("搜索:{0}", searchTextBox.Text);
                int idx = 0;
                foreach (string name in itemList.Select(n => n.DisplayName))
                {
                    if (name.StartsWith(searchTextBox.Text, StringComparison.OrdinalIgnoreCase))
                    {
                        Program.Assert(idx >= 0 && idx < grid.Rows.Count);
                        grid.CurrentCell = grid.Rows[idx].Cells[0];
                        break;
                    }
                    ++idx;
                }
            };
            form.Controls.Add(searchTextBox);
            grid.MouseClick += (o, e) => { searchTextBox.Text = string.Empty; };
            KeyPressEventHandler keyPressFunc = (o, e) =>
            {
                if (char.IsControl(e.KeyChar))
                {
                    return;
                }
                searchTextBox.Text          += e.KeyChar;
                searchTextBox.SelectionStart = searchTextBox.Text.Length;
            };
            PreviewKeyDownEventHandler previewKeyDownFunc = (o, e) =>
            {
                if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down ||
                    e.KeyCode == Keys.Escape || e.KeyCode == Keys.Enter)
                {
                    return;
                }
                searchTextBox.Focus();
            };

            form.KeyPress       += keyPressFunc;
            grid.KeyPress       += keyPressFunc;
            form.PreviewKeyDown += previewKeyDownFunc;
            grid.PreviewKeyDown += previewKeyDownFunc;

            // 弹出详细信息
            grid.DoubleClick += (o, e) =>
            {
                if (grid.SelectedRows == null || grid.SelectedRows.Count == 0)
                {
                    return;
                }
                int idx = grid.SelectedRows[0].Index;
                Program.Assert(idx >= 0 && idx < itemList.Count);
                TryUninstallItem(itemList[idx]);
            };

            // esc,退出
            KeyEventHandler escHandler = (o, e) =>
            {
                if (e.KeyCode == Keys.Escape)
                {
                    form.Close();
                }
            };

            form.KeyUp          += escHandler;
            grid.KeyUp          += escHandler;
            searchTextBox.KeyUp += escHandler;

            // 检测列表中的项目是否已经从注册表中删除,是的话重启
            var registryChangeDetectTimer = new System.Windows.Forms.Timer();

            registryChangeDetectTimer.Interval = 1000;
            registryChangeDetectTimer.Tick    += (o, e) =>
            {
                using (RegistryKey uninstallKey = OpenUninstallRegistryKey(false))
                {
                    List <string> subKeyNames = uninstallKey.GetSubKeyNames().ToList();
                    subKeyNames.Sort();
                    foreach (UinstallItem item in itemList)
                    {
                        if (subKeyNames.BinarySearch(item.RegistryKey) < 0)
                        {
                            Win32Import.WinExec(Environment.CommandLine, 5);
                            form.Close();
                            break;
                        }
                    }
                }
            };
            registryChangeDetectTimer.Start();

            Application.Run(form);
        }
Beispiel #2
0
        static void TryUninstallItem(UinstallItem item)
        {
            Form form = new Form();

            form.Size          = new Size(350, 300);
            form.Text          = item.DisplayName;
            form.StartPosition = FormStartPosition.CenterScreen;

            FlowLayoutPanel btnPanel = new FlowLayoutPanel();

            btnPanel.Dock          = DockStyle.Bottom;
            btnPanel.FlowDirection = FlowDirection.LeftToRight;
            btnPanel.BorderStyle   = BorderStyle.FixedSingle;
            btnPanel.Height        = 30;

            Button btnInstallFolder = new Button()
            {
                Text = "安装目录"
            };

            btnInstallFolder.Enabled = !string.IsNullOrEmpty(item.InstallFolder);
            btnInstallFolder.Click  += (o, e) =>
            {
                Win32Import.ShellExecute(form.Handle, "open", item.InstallFolder, null, null, 5);
            };
            btnPanel.Controls.Add(btnInstallFolder);

            Button btnUninstall = new Button()
            {
                Text = "卸载"
            };

            btnUninstall.Enabled = !string.IsNullOrEmpty(item.UninstallCmd);
            btnUninstall.Click  += (o, e) =>
            {
                if (Win32Import.WinExec(item.UninstallCmd, 5) > 31)
                {
                    form.Close();
                }
                else
                {
                    MessageBox.Show(
                        "卸载的过程中发生异常!",
                        "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            };
            btnPanel.Controls.Add(btnUninstall);

            Button btnDel = new Button()
            {
                Text = "删除"
            };

            btnDel.Click += (o, e) =>
            {
                if (!string.IsNullOrEmpty(item.UninstallCmd) &&
                    MessageBox.Show(
                        "检测到该软件自带卸载功能,仍然要强制从安装列表中删除项目吗?", "确认",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                {
                    return;
                }

                if (MessageBox.Show("这项操作具有很高的风险,你仍然要继续吗?", "确认",
                                    MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                {
                    return;
                }
                using (RegistryKey k = OpenUninstallRegistryKey(true))
                {
                    k.DeleteSubKey(item.RegistryKey);
                    form.Close();
                }
            };
            btnPanel.Controls.Add(btnDel);

            Button btnClose = new Button()
            {
                Text = "关闭"
            };

            btnClose.Click += (o, e) => { form.Close(); };
            btnPanel.Controls.Add(btnClose);

            PropertyGrid grid = new PropertyGrid();

            grid.Dock           = DockStyle.Fill;
            grid.PropertySort   = PropertySort.NoSort;
            grid.ToolbarVisible = false;
            grid.SelectedObject = item;

            form.Controls.Add(grid);
            form.Controls.Add(btnPanel);

            // esc处理
            KeyEventHandler escKeyupHandler = (o, e) =>
            {
                if (e.KeyCode == Keys.Escape)
                {
                    form.Close();
                }
            };

            form.KeyPreview = true;
            form.KeyUp     += escKeyupHandler;

            form.ShowDialog();
            form.Dispose();
        }