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); }
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(); }