.net對進程管理的封裝非常好,通過System.Diagnostics.Process.GetProcesses()方法可以獲得系統內各進程的數組,通過枚舉可獲得系統內的所有進程(比Windows內建的進程瀏覽器看到的還多)。
ProcessName屬性獲得的是檔案名稱的首碼,即NotePad,不包含後面的.exe。
要獲得更多的資訊,需要取得Modules屬性數組,但並不是每個進程都能擷取Modules屬性,所以必須要使用try..catch語句排除異常。該數組的第一個成員[ 0 ].FileName包含了執行程式的完整檔案名稱,等同於ProcessModule;序號大於0的成員往往包含該程式調用的dll資訊,得到的結果很有點像反木馬程式。
Kill()方法用來殺進程,被殺的程式不會彈出類似儲存檔案的對話方塊,是個十足的冷血的快刀手。
StartInfo屬性是用於啟動新進程的,不適用於檢索已啟動並執行進程。
private void btnProcess_Click(object sender, System.EventArgs e)
{
System.Diagnostics.Process []myPs ;
myPs=System.Diagnostics.Process.GetProcesses();
this.richTextBox1.Clear();
foreach (System.Diagnostics.Process p in myPs)
{
if (p.Id!=0 )
{
string myS="進程名稱"+p.ProcessName+" ID:"+p.Id.ToString();
try//由於進程不同,有的進程不包含Modules資訊,所以要用try保護
{
if (p.Modules !=null)
if (p.Modules.Count>0)
{
System.Diagnostics.ProcessModule pm=p.Modules[0];
myS+="\n Modules[0].FileName:"+pm.FileName;
myS+="\n Modules[0].ModuleName:"+pm.ModuleName;
myS+="\n Modules[0].FileVersionInfo:\n"+pm.FileVersionInfo.ToString();
if (pm.FileName.ToLower()==this.textBox1.Text.Trim().ToLower())
p.Kill();
}
}
catch
{}
finally
{
this.richTextBox1.Text += myS+"\n==========================\n";
}
}
}