C#编程_实现简易的任务管理器
实验要求
完成类似任务管理器界面,不严格按照下面界面设计。
基本要求
(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#编程_实现简易的任务管理器相关推荐
- 学习笔记:Java 并发编程①_基础知识入门
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...
- Java Review - 并发编程_ 回环屏障CyclicBarrier原理源码剖析
文章目录 Pre 小Demo 类图结构 CyclicBarrier核心方法源码解读 int await() int await(long timeout, TimeUnit unit) int dow ...
- Java Review - 并发编程_读写锁ReentrantReadWriteLock的原理源码剖析
文章目录 ReentrantLock VS ReentrantReadWriteLock 类图结构 非公平的读写锁实现 写锁的获取与释放 void lock() void lockInterrupti ...
- Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析
文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...
- 第2课第3节_Java面向对象编程_继承性_P【学习笔记】
摘要:韦东山android视频学习笔记 面向对象程序的三大特性之继承性:继承性的主要作用就是复用代码.继承性也有一定的限制,如图一 图一 1.我们在第2课第2节_Java面向对象编程_封装性_P 中 ...
- Windows核心编程_设置Windows开机自动登录
设置自动登录的方法在Windows中已经给出了非常方便的方法,当Windows内核进入登入界面时会检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ ...
- Windows核心编程_获取鼠标指定位置的RGB颜色值
Windows核心编程_获取鼠标指定位置的RGB颜色值 大家平常会见到很多屏幕取色工具,其原理都是获取鼠标位置的屏幕像素点颜色! 一般思路都是:获取鼠标位置,然后取出鼠标指向的屏幕像素点颜色! Get ...
- PHP 异步并行编程_韩天峰
2019独角兽企业重金招聘Python工程师标准>>> PHP 异步并行编程_韩天峰 韩天峰(Rango)多玩游戏平台技术负责人,swoole开源项目创始人.PHP的异步并行编程,介 ...
- java周志第二周_20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算
20165325 2017-2018-2 <Java程序设计>结对编程_第二周:四则运算 一.码云链接 1.Git提交日志已经实现一个功能/一个bug修复的注释说明,如图所示: 2.测试代 ...
最新文章
- Windows 7/Windows 8都有上帝模式
- 我说分布式事务之消息最终一致性事务(二):RocketMQ的实现
- Python成长之路第二篇(3)_字典的置函数用法
- 熵(Entropy),交叉熵(Cross-Entropy),KL-松散度(KL Divergence),似然(Likelihood)
- Linux之GDB调试命令
- 字符串、文件操作,英文词频统计预处理
- jquery 图片切换插件(初版)
- About UserAccountControl
- 正式开始学习GO语言
- Python3 递归算法
- 清空SQL数据库日志
- 阿里fastjson 对象转JSON
- 白话区块链 之 12 - 未花费事务输出 (UTXO) 是什么?
- 车型数据导入excel
- linux常用网络命令笔记
- Spanning Tree协议安全攻防
- 异常解决之——无法在Web服务器上启动调试。远程服务器返回错误:(405)
- 论EBS的并发请求(报表中心)的必要性
- 消防应急照明系统在某数据中心项目的应用
- 使用正则限制输入框只能输入英文和数字