进程实作(使用.Net平台)

 参考:http://msdn.microsoft.com/library/chs/default.asp?url=/library/chs/vbcon/html/vbtskManagingProcesses.asp

今天继续看进程,并用.Net平台作几个进程的实例。


1.获得本用户的“我的文档”目录,获得当前应用程序目录(无关进程知识):

    string myDocumentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);  //获取当前用户“我的文档”的具体目录
    string CurrentPath = Environment.CurrentDirectory;//获取当前应用程序目录

当然,Environment.SpecialFolder下还有好多属性选项。比如:
   

Cookies 用作 Internet Cookie 的公共储存库的目录。
Desktop 逻辑桌面,而不是物理文件系统位置。
DesktopDirectory 用于物理上存储桌面上的文件对象的目录。

不应将此目录与桌面文件夹本身混淆,后者是虚拟文件夹。

Favorites 用作用户收藏夹项的公共储存库的目录。
History 用作 Internet 历史记录项的公共储存库的目录。
InternetCache 用作 Internet 临时文件的公共储存库的目录。
LocalApplicationData 目录,它用作当前非漫游用户使用的应用程序特定数据的公共储存库。
MyComputer “我的电脑”文件夹。
MyMusic “My Music”文件夹。
MyPictures “My Pictures”文件夹。
    具体的可参考MSDN,讲得非常清楚。


2.启动某个进程:
    在.Net中启动某个进程是比较简单的事,只要创建Process对象,然后设置Process.StartInfo选项即可启动某个外部进程了。比如,我要在程序中打开某个Word文件:

Process proc = new Process();
proc.StartInfo.FileName 
= "E:\\1.doc";
proc.StartInfo.Vert 
= "Open"//这是打开,如果要打印,可以设置为"Print"即可。
proc.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;  //最大化显示窗口

    当然,还有更简单的方法,都无需实例化Process对象,只需调用Process的静态方法Start即可:   

ProcessStartInfo psInfo    =    new ProcessStartInfo();
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是这样解决的:

Process [] processes;
   processes = Process.GetProcessesByName("WINWORD");
   foreach(Process process in processes)
   {
    process.CloseMainWindow();
   }

4.确定进程是否正在响应:
    调用进程对象的Responding属性,如,下面程序查看Notepad.exe进程是否会响应,如是,则用CloseMainWindow关闭进程,如不会响应,则用Kill强制关闭进程:

Process[] notepads;
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对象中。
   

CBProcesses.Items.Clear();
Process[] processes;
processes     
= Process.GetProcesses();
foreach(Process process in processes)
{
     CBProcesses.Items.Add(process.ProcessName);
}

    (2)进程地址空间中加载了很多模块(即DLL,EXE文件),把它们列举出来。放在ListBox类型的LBProcesses中:

        private void CBProcesses_SelectedIndexChanged(object sender, System.EventArgs e)
     
{
            
//显示进程的模块的信息
            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 ProcPID = "PID(进程标识符):"+process[0].Id.ToString();  //进程标识符
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();
posted @ 2005-08-26 10:52  shipfi  阅读(546)  评论(0编辑  收藏  举报