2 2010-06-11 10:55
3
4 一、根据进程名获取进程的用户名?
5
6 需要添加对 System.Management.dll 的引用
7
8 using System.Diagnostics
9 using System.Management
10
11 static void Main(string[] args)
12 {
13 foreach (Process p in Process.GetProcesses())
14{
15 Console.Write(p.ProcessName)
16 Console.Write("----")
17 Console.WriteLine(GetProcessUserName(p.Id))
18}
19
20Console.ReadKey()
21 }
22
23 private static string GetProcessUserName(int pID)
24 {
25 string text1 = null
26
27 SelectQuery query1 = new SelectQuery("Select * from Win32_Process WHERE processID=" + pID)
28 ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(query1)
29
30 try
31 {
32 foreach (ManagementObject disk in searcher1.Get())
33 {
34 ManagementBaseObject inPar = null
35 ManagementBaseObject outPar = null
36
37 inPar = disk.GetMethodParameters("GetOwner")
38
39 outPar = disk.InvokeMethod("GetOwner", inPar, null)
40
41 text1 = outPar["User"].ToString()
42 break
43 }
44 }
45 catch
46 {
47 text1 = "SYSTEM"
48 }
49
50 return text1
51 }
52
53
54 进程名 是 p.ProcessName
55
56 二、获取进程
57
58 using System.Diagnostics
59 【注】System.Diagnostics 命名空野判禅间提供特定的类冲宴,使您能够与系统进程颂尘、事件日志和性能计数器进行交互。
60 string str = ""
61 Process[] processes
62 //Get the list of current active processes.
63 processes = System.Diagnostics.Process.GetProcesses()
64 //Grab some basic information for each process.
65 Process process
66 for(int i = 0i<processes.Length-1i++)
67 {
68 process = processes[i]
69 str = str + Convert.ToString(process.Id) + " : " +
70 process.ProcessName + "\r\n"
71 }
72 System.Windows.Forms.MessageBox.Show(str)
73 txtProcessID.Text = processes[0].Id.ToString()
74
75 //显示进程相关信息
76 string s = ""
77 System.Int32 processid
78 Process process
79 processid = Int32.Parse(txtProcessID.Text)
80 process = System.Diagnostics.Process.GetProcessById(processid)
81 s = s + "该进程的总体优先级类别:" + Convert.ToString(process.PriorityClass) + " \r\n"
82 s = s + "由该进程打开的句柄数:" + process.HandleCount + "\r\n"
83 s = s + "该进程的主窗口标题:" + process.MainWindowTitle + "\r\n"
84 s = s + " 该进程允许的最小工作集大小:" + process.MinWorkingSet.ToString() + " \r\n"
85 s = s + "该进程允许的最大工作集大小:" + process.MaxWorkingSet.ToString() + " \r\n"
86 s = s + "该进程的分页内存大小:" + process.PagedMemorySize + "\r\n"
87 s = s + "该进程的峰值分页内存大小:" + process.PeakPagedMemorySize + "\r\n"
88 System.Windows.Forms.MessageBox.Show(s)
89 }
90 catch
91 {
92 System.Windows.Forms.MessageBox.Show("不合法的进程ID!")
93 }
94 【注】Int32 值类型表示值介于-2,147,483,648 到+2,147,483,647 之间的有符号整数。
95 Int32 提供了一些方法,来比较该类型的实例、将实例的值转换为它的String 表示形式以及将数字的String 表示形式转换为该类型的实例。
96 有关格式规范代码如何控制值类型的String 表示形式的信息,请参阅格式设置概述。
97 此类型实现接口IComparable、IFormattable 和IConvertible。使用Convert 类进行转换,而不是使用此类型的IConvertible 显式接口成员实现。
98 值得一提的是,Process 类具有很多成员变量,这些成员变量可以获得进程的几乎每一个细节。上面的例子中只是简单地选择了几个成员加以演示。如果开发中有需要,可以参考MSDN Library,查询Process类成员以获得更详细的信息,这里就不一一列出了。
99
100 三、杀死进程
101
102 private void button2_Click(object sender, EventArgs e)
103 {
104 if (listView1.SelectedItems.Count >0)
105 {
106try
107{
108 string proName = listView1.SelectedItems[0].Text
109 Process[] p = Process.GetProcessesByName(proName)
110 p[0].Kill()
111 MessageBox.Show("进程关闭成功!")
112 GetProcess()
113}
114catch
115{
116 MessageBox.Show("无法关闭此进程!")
117}
118 }
119 else
120 {
121MessageBox.Show("请选择要终止的进程!")
122 }
123 }
124
125 四、C#中利用process类调用外部程序以及执行dos命令
126
127 private string RunCmd(string command)
128 {
129 //实例一个Process类,启动一个独立进程
130 Process p = new Process()
131 //Process类有一个StartInfo属性
132 //设定程序名
133 p.StartInfo.FileName = "cmd.exe"
134 //设定程式执行参数
135 p.StartInfo.Arguments = "/c " + command
136 //关闭Shell的使用
137 p.StartInfo.UseShellExecute = false
138 //重定向标准输入
139 p.StartInfo.RedirectStandardInput = true
140 p.StartInfo.RedirectStandardOutput = true
141 //重定向错误输出
142 p.StartInfo.RedirectStandardError = true
143 //设置不显示窗口
144 p.StartInfo.CreateNoWindow = true
145 //启动
146 p.Start()
147 //也可以用这种方式输入要执行的命令
148 //不过要记得加上Exit要不然下一行程式执行的时候会当机
149 //p.StandardInput.WriteLine(command)
150 //p.StandardInput.WriteLine("exit")
151 //从输出流取得命令执行结果
152 return p.StandardOutput.ReadToEnd()
153 }
Runtime.exec("notepad") 返回的Process实例是基于Process子类,这点无需质疑。任何成功实例化的对象所属的类都是非抽象的实现类,抽象的方法已被实现。碧肆
如果想查找其真实子类,可通过:
System.out.println( Process实例引用团和.getClass().getName() )// 详细可参考JAVA反射机制
或塌慧盯着 查源码/Debug 跟踪 Runtime.exec 方法的执行过程。
以上是我告诉你是些常用的技巧,这里根据我看到的源码说说:
Runtime.exec 实际上调用了 java.lang.ProcessBuilder 的实现,不懂的可查 API 文档;
而ProcessBuilder 内部调用 java.lang.ProcessImpl.start(...) 静态方法 返回1个 ProcessImpl实例;
ProcessImpl类 正好是 Process类 的子类。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)