using System; using System.Threading; using System.Windows.Forms; using Diagnostics = System.Diagnostics; namespace ProcessInfo { public class ProcessListView : ListView { private ProcessListViewItemComparer comparer; private delegate void ListViewItemDelegate( ListViewItem item ); public ProcessListView() : base() { this.View = View.Details; // columns must be added in same order they appear in ProcessField this.Columns.Add( "PID", 100, HorizontalAlignment.Right ); this.Columns.Add( "Image Name", 150, HorizontalAlignment.Left ); this.Columns.Add( "Working Set", 100, HorizontalAlignment.Right ); comparer = new ProcessListViewItemComparer(); this.ListViewItemSorter = comparer; this.Sort( ProcessField.Pid, true ); } public void Sort( ProcessField sortField ) { if ( sortField.Equals( comparer.CompareField ) ) { this.Sort( sortField, !comparer.Ascending ); } else { this.Sort( sortField, true ); } } public void Sort( ProcessField sortField, bool ascending ) { comparer.CompareField = sortField; comparer.Ascending = ascending; this.Sort(); } // thread-safe public void RefreshProcesses() { // must access Control on thread that created it this.Invoke( new MethodInvoker( this.Items.Clear ) ); foreach( Diagnostics.Process process in Diagnostics.Process.GetProcesses() ) { ProcessListViewItem listViewItem = new ProcessListViewItem( new Process( process ) ); process.Dispose(); ListViewItemDelegate addItem = new ListViewItemDelegate( AddItem ); Object[] parameters = new Object[]{ listViewItem }; this.Invoke( addItem, parameters ); } } protected override void OnColumnClick( ColumnClickEventArgs e ) { this.Sort( (ProcessField)Enum.ToObject( typeof(ProcessField), e.Column ) ); } // for cross-thread calls private void AddItem( ListViewItem item ) { this.Items.Add( item ); } } }