欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解析C#中用Process类杀死进程,执行命令的深入分析

程序员文章站 2023-12-20 14:15:22
c#之process类相关整理一、根据进程名获取进程的用户名?需要添加对 system.management.dll 的引用复制代码 代码如下:using system.d...
c#之process类相关整理
一、根据进程名获取进程的用户名?
需要添加对 system.management.dll 的引用
复制代码 代码如下:

using system.diagnostics;
using system.management;
static void main(string[] args)
{
foreach (process p in process.getprocesses())
{
console.write(p.processname);
console.write("----");
console.writeline(getprocessusername(p.id));
}
console.readkey();
}
private static string getprocessusername(int pid)
{
string text1 = null;
selectquery query1 = new selectquery("select * from win32_process where processid=" + pid);
managementobjectsearcher searcher1 = new managementobjectsearcher(query1);
try
{
foreach (managementobject disk in searcher1.get())
{
managementbaseobject inpar = null;
managementbaseobject outpar = null;
inpar = disk.getmethodparameters("getowner");
outpar = disk.invokemethod("getowner", inpar, null);
text1 = outpar["user"].tostring();
break;
}
}
catch
{
text1 = "system";
}
return text1;
}

进程名 是 p.processname
二、获取进程
using system.diagnostics;
【注】system.diagnostics 命名空间提供特定的类,使您能够与系统进程、事件日志和性能计数器进行交互。
复制代码 代码如下:

string str = "";
process[] processes;
//get the list of current active processes.
processes = system.diagnostics.process.getprocesses();
//grab some basic information for each process.
process process;
for(int i = 0;i<processes.length-1;i++)
{
process = processes[i];
str = str + convert.tostring(process.id) + " : " +
process.processname + "\r\n";
}
system.windows.forms.messagebox.show(str);
txtprocessid.text = processes[0].id.tostring();
//显示进程相关信息
string s = "";
system.int32 processid;
process process;
processid = int32.parse(txtprocessid.text);
process = system.diagnostics.process.getprocessbyid(processid);
s = s + "该进程的总体优先级类别:" + convert.tostring(process.priorityclass) + " \r\n";
s = s + "由该进程打开的句柄数:" + process.handlecount + "\r\n";
s = s + "该进程的主窗口标题:" + process.mainwindowtitle + "\r\n";
s = s + " 该进程允许的最小工作集大小:" + process.minworkingset.tostring() + " \r\n";
s = s + "该进程允许的最大工作集大小:" + process.maxworkingset.tostring() + " \r\n";
s = s + "该进程的分页内存大小:" + process.pagedmemorysize + "\r\n";
s = s + "该进程的峰值分页内存大小:" + process.peakpagedmemorysize + "\r\n";
system.windows.forms.messagebox.show(s);
}
catch
{
system.windows.forms.messagebox.show("不合法的进程id!");
}

【注】int32 值类型表示值介于-2,147,483,648 到+2,147,483,647 之间的有符号整数。
int32 提供了一些方法,来比较该类型的实例、将实例的值转换为它的string 表示形式以及将数字的string 表示形式转换为该类型的实例。
有关格式规范代码如何控制值类型的string 表示形式的信息,请参阅格式设置概述。
此类型实现接口icomparable、iformattable 和iconvertible。使用convert 类进行转换,而不是使用此类型的iconvertible 显式接口成员实现。
值得一提的是,process 类具有很多成员变量,这些成员变量可以获得进程的几乎每一个细节。上面的例子中只是简单地选择了几个成员加以演示。如果开发中有需要,可以参考msdn library,查询process类成员以获得更详细的信息,这里就不一一列出了。
三、杀死进程
复制代码 代码如下:

private void button2_click(object sender, eventargs e)
{
if (listview1.selecteditems.count > 0)
{
try
{
string proname = listview1.selecteditems[0].text;
process[] p = process.getprocessesbyname(proname);
p[0].kill();
messagebox.show("进程关闭成功!");
getprocess();
}
catch
{
messagebox.show("无法关闭此进程!");
}
}
else
{
messagebox.show("请选择要终止的进程!");
}
}

四、c#中利用process类调用外部程序以及执行dos命令
复制代码 代码如下:

private string runcmd(string command)
{
//实例一个process类,启动一个独立进程
process p = new process();
//process类有一个startinfo属性
//设定程序名
p.startinfo.filename = "cmd.exe";
//设定程式执行参数
p.startinfo.arguments = "/c " + command;
//关闭shell的使用
p.startinfo.useshellexecute = false;
//重定向标准输入
p.startinfo.redirectstandardinput = true;
p.startinfo.redirectstandardoutput = true;
//重定向错误输出
p.startinfo.redirectstandarderror = true;
//设置不显示窗口
p.startinfo.createnowindow = true;
//启动
p.start();
//也可以用这种方式输入要执行的命令
//不过要记得加上exit要不然下一行程式执行的时候会当机
//p.standardinput.writeline(command);
//p.standardinput.writeline("exit");
//从输出流取得命令执行结果
return p.standardoutput.readtoend();
}

上一篇:

下一篇: