今天继续看进程,并用.Net平台作几个进程的实例。
1.获得本用户的“我的文档”目录,获得当前应用程序目录(无关进程知识):
string CurrentPath = Environment.CurrentDirectory; // 获取当前应用程序目录
当然,Environment.SpecialFolder下还有好多属性选项。比如:
Cookies | 用作 Internet Cookie 的公共储存库的目录。 |
Desktop | 逻辑桌面,而不是物理文件系统位置。 |
DesktopDirectory | 用于物理上存储桌面上的文件对象的目录。 不应将此目录与桌面文件夹本身混淆,后者是虚拟文件夹。 |
Favorites | 用作用户收藏夹项的公共储存库的目录。 |
History | 用作 Internet 历史记录项的公共储存库的目录。 |
InternetCache | 用作 Internet 临时文件的公共储存库的目录。 |
LocalApplicationData | 目录,它用作当前非漫游用户使用的应用程序特定数据的公共储存库。 |
MyComputer | “我的电脑”文件夹。 |
MyMusic | “My Music”文件夹。 |
MyPictures | “My Pictures”文件夹。 |
2.启动某个进程:
在.Net中启动某个进程是比较简单的事,只要创建Process对象,然后设置Process.StartInfo选项即可启动某个外部进程了。比如,我要在程序中打开某个Word文件:
proc.StartInfo.FileName = " E:\\1.doc " ;
proc.StartInfo.Vert = " Open " ; // 这是打开,如果要打印,可以设置为"Print"即可。
proc.StartInfo.WindowStyle = ProcessWindowStyle.Maximized; // 最大化显示窗口
当然,还有更简单的方法,都无需实例化Process对象,只需调用Process的静态方法Start即可:
psInfo.FileName = " e:\\1.doc " ;
psInfo.Verb = " Print " ;
psInfo.WindowStyle = ProcessWindowStyle.Normal;
Process.Start(psInfo);
最简单的,Process.Start("E:\\1.doc");一句话即可调用外部进程。
3.关闭进程
关闭进程有两种方法:
(1)如果进程有图形界面窗口,则调用CloseMainWindow()函数。
(2)如果是Console窗口,则调用Kill()函数。
比如,上面的进程则可以这样关闭:
process.WindowMainWindow();
一个问题,如果持有进程的对象,则可以调用它来关闭进程,但是,我并不持有进程的对象的情况怎么办?就像第二种打开进程方法,根本就没有进程对象嘛。
MSDN是这样解决的:
processes = Process.GetProcessesByName("WINWORD");
foreach(Process process in processes)
{
process.CloseMainWindow();
}
4.确定进程是否正在响应:
调用进程对象的Responding属性,如,下面程序查看Notepad.exe进程是否会响应,如是,则用CloseMainWindow关闭进程,如不会响应,则用Kill强制关闭进程:
notepads = Process.GetProcessesByName( " Notepad.exe " );
// Test to see if the process is responding.
if (notepads[ 0 ].Responding)
{
notepads[0].CloseMainWindow();
}
else
{
notepads[0].Kill();
}
5.确定进程是否已经退出:
调用Process的HasExit属性。则可确定进程有无退出。
6.实例:
做了一个枚举所有进程的实例,在.net下面实现比较简单,所有的东西都给封装好了。源代码两行就可以把所有进程列举出来了。
(1)列举所有进程,显示在ComboBox类型的CBProcesses对象中。
Process[] processes;
processes = Process.GetProcesses();
foreach (Process process in processes)
{
CBProcesses.Items.Add(process.ProcessName);
}
(2)进程地址空间中加载了很多模块(即DLL,EXE文件),把它们列举出来。放在ListBox类型的LBProcesses中:
{
//显示进程的模块的信息
LBProcesses.Items.Clear();
Process[] process = Process.GetProcessesByName(CBProcesses.Items[CBProcesses.SelectedIndex].ToString());
try
{
foreach(ProcessModule aModule in process[0].Modules)
{
LBProcesses.Items.Add(aModule.ModuleName+' '+aModule.FileName);
}
}
catch
{
return;
}
}
(3)显示进程的一些详细信息:
这个都是调用Process对象中的一些方法,以获得其信息,MSDN中有详细介绍,需要时可翻MSDN:
string ProcCPU = " CPU使用总时间: " + process[ 0 ].TotalProcessorTime.TotalMinutes.ToString() + " 分钟 " ; // CPU使用,以分钟表示
string ProcCPUTime = " 获得此时间用户的CPU时间: " + process[ 0 ].UserProcessorTime.TotalMinutes.ToString() + " 分钟 " ; // CPU时间,以分钟表示
string ProcMemory = " 内存使用: " + (process[ 0 ].WorkingSet / 1024 ).ToString() + " KB " ;
string ProcPriority = " 优先级: " + process[ 0 ].BasePriority.ToString();