实验要求

完成类似任务管理器界面,不严格按照下面界面设计。

基本要求
(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; }}}
}

问题

结束进程和打开进程之后的刷新过程,十分缓慢。

应该是获取进程信息的时候比较慢;

C#编程_实现简易的任务管理器相关推荐

  1. 学习笔记:Java 并发编程①_基础知识入门

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...

  2. Java Review - 并发编程_ 回环屏障CyclicBarrier原理源码剖析

    文章目录 Pre 小Demo 类图结构 CyclicBarrier核心方法源码解读 int await() int await(long timeout, TimeUnit unit) int dow ...

  3. Java Review - 并发编程_读写锁ReentrantReadWriteLock的原理源码剖析

    文章目录 ReentrantLock VS ReentrantReadWriteLock 类图结构 非公平的读写锁实现 写锁的获取与释放 void lock() void lockInterrupti ...

  4. Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析

    文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...

  5. 第2课第3节_Java面向对象编程_继承性_P【学习笔记】

    摘要:韦东山android视频学习笔记  面向对象程序的三大特性之继承性:继承性的主要作用就是复用代码.继承性也有一定的限制,如图一 图一 1.我们在第2课第2节_Java面向对象编程_封装性_P 中 ...

  6. Windows核心编程_设置Windows开机自动登录

    设置自动登录的方法在Windows中已经给出了非常方便的方法,当Windows内核进入登入界面时会检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ ...

  7. Windows核心编程_获取鼠标指定位置的RGB颜色值

    Windows核心编程_获取鼠标指定位置的RGB颜色值 大家平常会见到很多屏幕取色工具,其原理都是获取鼠标位置的屏幕像素点颜色! 一般思路都是:获取鼠标位置,然后取出鼠标指向的屏幕像素点颜色! Get ...

  8. PHP 异步并行编程_韩天峰

    2019独角兽企业重金招聘Python工程师标准>>> PHP 异步并行编程_韩天峰 韩天峰(Rango)多玩游戏平台技术负责人,swoole开源项目创始人.PHP的异步并行编程,介 ...

  9. java周志第二周_20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算

    20165325 2017-2018-2 <Java程序设计>结对编程_第二周:四则运算 一.码云链接 1.Git提交日志已经实现一个功能/一个bug修复的注释说明,如图所示: 2.测试代 ...

最新文章

  1. Windows 7/Windows 8都有上帝模式
  2. 我说分布式事务之消息最终一致性事务(二):RocketMQ的实现
  3. Python成长之路第二篇(3)_字典的置函数用法
  4. 熵(Entropy),交叉熵(Cross-Entropy),KL-松散度(KL Divergence),似然(Likelihood)
  5. Linux之GDB调试命令
  6. 字符串、文件操作,英文词频统计预处理
  7. jquery 图片切换插件(初版)
  8. About UserAccountControl
  9. 正式开始学习GO语言
  10. Python3 递归算法
  11. 清空SQL数据库日志
  12. 阿里fastjson 对象转JSON
  13. 白话区块链 之 12 - 未花费事务输出 (UTXO) 是什么?
  14. 车型数据导入excel
  15. linux常用网络命令笔记
  16. Spanning Tree协议安全攻防
  17. 异常解决之——无法在Web服务器上启动调试。远程服务器返回错误:(405)
  18. 论EBS的并发请求(报表中心)的必要性
  19. 消防应急照明系统在某数据中心项目的应用
  20. 使用正则限制输入框只能输入英文和数字

热门文章

  1. CPU结构及工作原理
  2. nginx02-RTFM
  3. jrtplib下载地址
  4. 递归算法与非递归算法的转化
  5. HTTP和HTTPS HTTPS为什么更安全?
  6. win8常见系统漏洞
  7. 写需求规格说明书/产品定义的个人总结
  8. 统计学,机器学习,深度学习,数据挖掘的联系
  9. html点击出现表单弹窗
  10. 位置式PID与增量式PID区别浅析(百度百科增量式PID讲解思路概念更明确清晰)