實驗要求
完成類似任務管理器界面,不嚴格按照下面界面設計。
基本要求
(1)獲取本機所有進程信息,並且篩選部分核心信息展示,例如進程名,id,內存等。
(2)關閉選中進程。
(3) 實現類似“運行”功能,即輸入進程文件名,啓動進程(可選)。
(4)提示,務必注意異常處理,部分進程信息無法正常獲取,這時不顯示這些i信息即可。
實驗過程
界面設計
佈局採用的Grid網格佈局。首先確定3行,在Grid的屬性中添加;
給三行設置好適合的寬度;
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="350"/>
<RowDefinition/>
</Grid.RowDefinitions>
在第一行放一個標籤,用來顯示標題,設置佈局爲水平填充。
第二行放置DataGrid來存放進程的各項屬性值;
<DataGrid Grid.Row="1" Height="350" Grid.RowSpan="2" VerticalAlignment="Top"/>
放在第二行,仍設置爲水平填充,設置好適合的高度。
然後爲DataGrid添加合適的列
給每一列添加合適的寬度的標題
;
第三行來放置兩個按鈕,來控制啓動和終止進程;
<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裏面,便與對按鈕進行控制;
至此,界面大致完成;
後臺代碼
獲取進程信息
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("權限不足");
}
}
實驗結果
最終完成如下圖所示的界面
可顯示,進程總數,輸入進程的名字,可打開進程。選中一個進程,可以結束這個進程。
界面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; }
}
}
}
問題
結束進程和打開進程之後的刷新過程,十分緩慢。
應該是獲取進程信息的時候比較慢;