c#之process类相关整理

转自:http://www.oschina.net/code/snippet_119226_6188


c#之process类相关整理

2010-06-11 10:55
 
一、根据进程名获取进程的用户名?
 
需要添加对 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();
}

附加:MSDN中 Process.StandardOutput 属性 一节的一个举例:

The following example runs the ipconfig.exe command and redirects its standard output to the example’s console window.

using System;
using System.IO;
using System.Diagnostics;

class StandardOutputExample
{
    public static void Main()
    {        
        Process process = new Process();
        process.StartInfo.FileName = "ipconfig.exe";        
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;        
        process.Start();

        // Synchronously read the standard output of the spawned process. 
        StreamReader reader = process.StandardOutput;
        string output = reader.ReadToEnd();

        // Write the redirected output to this application's window.
        Console.WriteLine(output);

        process.WaitForExit();
        process.Close();

        Console.WriteLine("\n\nPress any key to exit.");
        Console.ReadLine();
    }
}


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