C#編程_實現簡易的任務管理器

實驗要求

完成類似任務管理器界面,不嚴格按照下面界面設計。

基本要求
(1)獲取本機所有進程信息,並且篩選部分核心信息展示,例如進程名,id,內存等。
(2)關閉選中進程。
(3) 實現類似“運行”功能,即輸入進程文件名,啓動進程(可選)。
(4)提示,務必注意異常處理,部分進程信息無法正常獲取,這時不顯示這些i信息即可。

image-20200316161409866

實驗過程

界面設計

佈局採用的Grid網格佈局。首先確定3行,在Grid的屬性中添加;

image-20200316165636217

給三行設置好適合的寬度;

 <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="350"/>
            <RowDefinition/>
        </Grid.RowDefinitions>

image-20200316163842514

在第一行放一個標籤,用來顯示標題,設置佈局爲水平填充。
image-20200317113703016

第二行放置DataGrid來存放進程的各項屬性值;

<DataGrid Grid.Row="1" Height="350" Grid.RowSpan="2" VerticalAlignment="Top"/>

放在第二行,仍設置爲水平填充,設置好適合的高度。

然後爲DataGrid添加合適的列
image-20200316164533266

給每一列添加合適的寬度的標題image-20200316165319648

第三行來放置兩個按鈕,來控制啓動和終止進程;

 <StackPanel Grid.Row="2" Height="40" Grid.RowSpan="2" VerticalAlignment="Center" Orientation="Horizontal" HorizontalAlignment="Right">
            <Button Content="啓動進程" Margin="0,0,80,0"/>
            <Button Content="終止進程"/>
        </StackPanel>

把按鈕放在StackPanel裏面,便與對按鈕進行控制;

image-20200316164109365
至此,界面大致完成;

後臺代碼

獲取進程信息

 Process[] processes = Process.GetProcesses();

利用Process類即可,關鍵是如何與前臺的DataGrid聯繫起來。

這裏創建了一個類,來與DataGrid 的各項和線程的屬性聯繫起來。

  public class Data
        {
            public string Name { set; get; }
            public int Id { set; get; }
            public string FileName { get; set; }
            public string StartTime { get;  set; }
            public string TotalMemery { get;  set; }
        }

創建一個泛型列表來存儲這些數據;

 List<Data> datas = new List<Data>();//創建一個泛型列表來存數據信息
private void RefreshDatainfo()
        {
            //獲取所有的進程信息
            datagrid.ItemsSource = null;//清空列表
            datas.Clear();//清空一下泛型列表
            Process[] processes = Process.GetProcesses();
            sumPs.Content = processes.Length;//顯示進程總數
            foreach (Process item in processes)
            {
                Data data = new Data();//實例化一個data對象
                data.Id = item.Id;
                data.Name = item.ProcessName;
                try
                {
                    data.FileName = item.MainModule.FileName; //路徑
                }
                catch(Exception ex)
                {
                    data.FileName = "";
                }
                try
                {
                    data.StartTime = item.StartTime.ToString("yyyy-M-dd HH:mm:ss"); //啓動時間
                }
                catch(Exception ex)
                {
                    data.StartTime = "";
                }
                data.TotalMemery = String.Format("{0,10:0}KB ",item.WorkingSet64 / 1024);//內存信息
                datas.Add(data);
            }
            datagrid.ItemsSource = datas;
        }

關閉進程

這裏注意需要進行一個強制類型轉換

private void KillbyID()
        {
            var a = datagrid.SelectedItem;
            Data SelectItem = a as Data;
            try
            {
                Process p = Process.GetProcessById(SelectItem.Id);
                    p.Kill();
                    p.WaitForExit();
                    RefreshDatainfo();
                
            }
            catch (Exception ex)
            {
                MessageBox.Show("權限不足");
            }
        }

實驗結果

最終完成如下圖所示的界面
image-20200316170612640

可顯示,進程總數,輸入進程的名字,可打開進程。選中一個進程,可以結束這個進程。

界面XMAL代碼

<Window x:Class="Task_manager.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Task_manager"
        mc:Ignorable="d"
        Title="任務管理器" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="350"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Content="進程管理" Grid.Row="0" VerticalAlignment="Top"/>
        <DataGrid Name="datagrid" Grid.Row="1" Height="350" Grid.RowSpan="2" VerticalAlignment="Top" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Id}" ClipboardContentBinding="{x:Null}" Header="進程ID"/>
                <DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="進程名字" Width="100"/>
                <DataGridTextColumn Binding="{Binding FileName}" ClipboardContentBinding="{x:Null}" Header="路徑" Width="200"/>
                <DataGridTextColumn Binding="{Binding StartTime}" ClipboardContentBinding="{x:Null}" Header="啓動時間" Width="100"/>
                <DataGridTextColumn Binding="{Binding TotalMemery}" ClipboardContentBinding="{x:Null}" Header="佔用內存" Width="100"/>

            </DataGrid.Columns>

        </DataGrid>
        <StackPanel  Grid.Row="2" Height="40" VerticalAlignment="Center" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,0,10.333,0.667" Width="640">
            <Label Content="進程名字"/>
            <Label Name="sumPs" Content="進程數" RenderTransformOrigin="-8.951,0.575" Width="52" Margin="-143,0,155,0"/>
            <TextBox Name="psname" TextWrapping="Wrap" Width="122" Margin="-45,0,78,0" Height="40" VerticalAlignment="Bottom" />
            <Button Name="startbtn" Content="啓動進程" Margin="0,0,80,0" Click="startbtn_Click"/>
            <Button Name="stopbtn" Content="終止進程" Click="stopbtn_Click"/>




        </StackPanel>

    </Grid>
</Window>

後臺代碼

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Task_manager
{
    /// <summary>
    /// MainWindow.xaml 的交互邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        List<Data> datas = new List<Data>();//創建一個泛型列表來存數據信息
        public MainWindow()
        {
            InitializeComponent();
            RefreshDatainfo();
        }

        private void RefreshDatainfo()
        {
            //獲取所有的進程信息
            datagrid.ItemsSource = null;//清空列表
            datas.Clear();//清空一下泛型列表
            Process[] processes = Process.GetProcesses();
            sumPs.Content = processes.Length;//顯示進程總數
            foreach (Process item in processes)
            {
                Data data = new Data();//實例化一個data對象
                data.Id = item.Id;
                data.Name = item.ProcessName;
                try
                {
                    data.FileName = item.MainModule.FileName; //路徑
                }
                catch(Exception ex)
                {
                    data.FileName = "";
                }
                try
                {
                    data.StartTime = item.StartTime.ToString("yyyy-M-dd HH:mm:ss"); //啓動時間
                }
                catch(Exception ex)
                {
                    data.StartTime = "";
                }
                data.TotalMemery = String.Format("{0,10:0}KB ",item.WorkingSet64 / 1024);//內存信息
                datas.Add(data);
            }
            datagrid.ItemsSource = datas;
        }

        private void startbtn_Click(object sender, RoutedEventArgs e)
        {
            string getbytext = psname.Text;
            Process p = new Process();
            p.StartInfo.FileName = getbytext;
            p.Start();
            RefreshDatainfo();
        }

        private void stopbtn_Click(object sender, RoutedEventArgs e)
        {
            KillbyID();
           // KillProgram();

        }

        private void KillProgram()
        {
            var a = datagrid.SelectedItem;
            Data SelectItem = a as Data;
            try
            {
                Process[] ps = Process.GetProcessesByName(SelectItem.Name);

                foreach (Process p in ps)
                {

                    p.Kill();
                    p.WaitForExit();
                    RefreshDatainfo();

                }


            }
            catch (Exception ex)
            {
                MessageBox.Show("權限不足");
            }
        }

        private void KillbyID()
        {
            var a = datagrid.SelectedItem;
            Data SelectItem = a as Data;
            try
            {
                Process p = Process.GetProcessById(SelectItem.Id);
                    p.Kill();
                    p.WaitForExit();
                    RefreshDatainfo();
                
            }
            catch (Exception ex)
            {
                MessageBox.Show("權限不足");
            }
        }

        public class Data
        {
            public string Name { set; get; }
            public int Id { set; get; }
            public string FileName { get; set; }
            public string StartTime { get;  set; }
            public string TotalMemery { get;  set; }
        }

      
    }
}

問題

結束進程和打開進程之後的刷新過程,十分緩慢。

應該是獲取進程信息的時候比較慢;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章