Process类位于System.Diagnostics名称空间下,它专门用于完成系统进程的管理任务。可以在本地计算机上启动和停止进程,也可以向进程查询特定类型的信息。在远程计算机上,无法启动和停止进程,但可以查询进程的相关信息。在对进程进行操作时,首先要创建Process类的实例,其次还需要设置其对象成员的StartInfo属性,最后调用它的Start方法。
例.启动、停止和观察进程
1. 新建一个名为ProcessExample的Windows应用程序。
2. 从工具箱中将Process组件拖放到设计窗体。
3. 添加名称空间 :
using System.Diagnostics;
using System.Threading;
4. 添加“启动记事本”、“停止记事本”和“观察所有进程”三个按钮,并添加Click事件代码:
private void buttonStart_Click(object sender, EventArgs e)
{
process1.StartInfo.FileName = "notepad.exe";
//启动Notepad.exe进程.
process1.Start();
}private void buttonStop_Click(object sender, EventArgs e)
{
//创建新的Process组件的数组,并将它们与指定的进程名称(Notepad)的所有进程资源相关联.
Process[] myprocesses;
myprocesses = Process.GetProcessesByName("Notepad");
foreach (Process instance in myprocesses)
{
//设置终止当前线程前等待1000毫秒
instance.WaitForExit(1000);
instance.CloseMainWindow();
}
}
private void buttonView_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
//创建Process类型的数组,并将它们与系统内所有进程相关联
Process[] processes;
processes = Process.GetProcesses();
foreach (Process p in processes)
{
//由于访问Idle的StartTime会出现异常,所以将其排除在外
if (p.ProcessName != "Idle")
{
//将每个进程名和进程开始时间加入listBox1中
this.listBox1.Items.Add(
string.Format("{0,-30}{1:h:m:s}", p.ProcessName, p.StartTime));
}
}
}
在System.Threading名称空间下, Thread类是用于创建和控制线程的,对线程的常用操作有:启动线程、终止线程、合并线程和让线程休眠等。
例.在程序中使用线程
1. 新建一个名为ThreadExample的Windows应用程序 。
2.向设计窗体拖放一个Timer组件。
3.名称空间:using System.Threading;
4.字段声明:
StringBuilder sb = new StringBuilder();
Thread thread1;
Thread thread2;
5. 代码:
private void AppendString(string s)
{
lock (sb)
{
str.Append(s);
}
}
public void Method1()
{
while(true)
{
Thread.Sleep(100); //线程休眠100毫秒
AppendString("a");
}
}
public void Method2()
{
while(true)
{
Thread.Sleep(100); //线程休眠100毫秒
AppendString("b");
}
}
6. 启动线程和终止线程按钮的Click事件中添加代码:
private void buttonStart_Click(object sender, EventArgs e)
{
sb.Remove(0, sb.Length);
timer1.Enabled = true;
thread1 = new Thread(new ThreadStart(Method1));
thread2 = new Thread(new ThreadStart(Method2));
thread1.Start();
thread2.Start();
}
private void buttonAbort_Click(object sender, EventArgs e)
{
thread1.Abort();
thread1.Join(10);
thread2.Abort();
thread2.Join(10);
}
7. timer1的Tick事件代码:
private void timer1_Tick(object sender, EventArgs e)
{
if (thread1.IsAlive == true || thread2.IsAlive == true)
{
richTextBox1.Text = sb.ToString();
}
else
{
timer1.Enabled = false;
}
}
编译并执行,单击启动线程后,等一会再单击终止
线程,查看运行结果。
默认情况下,为了防止引起死锁等不安全因素,C#不允许在一个线程中直接操作另一个线程中的控件。但是在Windows应用程序中,为了在窗体上显示线程中处理的信息,我们可能需要经常在一个线程中引用另一个线程中的窗体控件。比较常用的办法是使用委托(delegate)来完成这个工作。
这个该怎么实现?
附,如何根据Handle来切换应用程序
Process[] ps;
Process ps1 = new Process();
ps = Process.GetProcesses();
for(int i=0;i<=ps.Length-1;i++)
{
MessageBox.Show(""+ps[i].ProcessName);
if(ps[i].ProcessName=="QQ")
{
MessageBox.Show(""+ps[i].Handle);
return;
}
}
这段代码在网上找到的,未验证。