程序管理
在C#中我們可以用
System.Diagnostics
命名空間下的Process類來進行程序管理。
- 對本機
- (1)可以啟動、終止某個程序
- (2)可以檢視程序相關資訊,如CPU使用率等
- (3)可以檢視程序工作狀态
- 對遠端計算機
- (1)可以檢視遠端計算機相關資訊
- (2)無法直接啟動、終止遠端計算機
- 在一個程式中處理其他的程式(比如調用其他
檔案、 快捷方式等),實際上就是對程序進行管理。.exe
應用場景
擷取程序資訊、程序管理
如任務管理器
啟動其他程序
- 打開某個程式
- 打開指令行執行指令
啟動程序
我們以打開記事本為例
添加一個按鈕,設定點選事件。
private void Button_Click(object sender, RoutedEventArgs e)
{
Process p = new Process(); //建立一個程序執行個體
p.StartInfo.FileName="notepad";//程式的名字
p.StartInfo.Arguments = "1.txt";//參數
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;//程式打開的視窗風格,最大化,最下化等
p.Start();//啟動執行個體
}
啟動後
注意:啟動的程式如果不加路徑,那麼必須在環境變量或這在程式的相同路徑下,不然就會異常。
還可以直接啟動
Process.Start("notepad");
啟動程序涉及的方法和屬性
- StartInfo屬性:擷取或設定要傳遞給啟動程序的檔案名以及啟動參數
- Start方法:啟動程序資源并将其與Process元件關聯
啟動程序的兩種方法
- 執行個體化啟動
- 建立Process類的執行個體
- StartInfo屬性指定要運作的應用程式名稱以及傳遞的參數
- Start方法啟動該程序
- 直接調用Process類提供的Start靜态方法啟動程序
擷取程序資訊
Process類的有關程序資訊的屬性:
- MachineName屬性:關聯程序正在其上運作的計算機名
- MainModule屬性:擷取關聯程序的主子產品
- Modules屬性:擷取由關聯程序加載的子產品
- TotalProcessorTime屬性:擷取程序的總的處理器時間
- StartTime屬性:擷取關聯程序的啟動時間
- WorkingSet64屬性:為程序配置設定的實體記憶體量(位元組數)
擷取所有程序資訊
GetProcesses
靜态方法用于建立新的
Process數組
,并将該數組與本地計算機上的所有程序資源相關聯。
- (1)擷取本地計算機的所有程序:
-
Process[] myProcesses = Process.GetProcesses();
-
- (2)擷取遠端計算機的所有程序:
-
Process[] myProcesses =Process.GetProcesses (remoteMachineName);
-
static void Main(string[] args)
{
Process[] processes = Process.GetProcesses();
foreach (Process item in processes)
{
Console.WriteLine("程序名字:" + item.ProcessName);
Console.WriteLine("程序ID:" + item.Id);
try
{
Console.WriteLine("啟動時間:" + item.StartTime);
}
catch(Exception ex)
{
Console.WriteLine("權限不足");
}
Console.WriteLine("線程數:" + item.Threads.Count);
Console.WriteLine("-----------------------------------");
}
Console.ReadLine();
}
擷取指定程序資訊
GetProcessById
GetProcessById
- 靜态方法
- 根據程序 ID查找
- 傳回唯一Process對象
例如
程序名字:chrome
程序ID:5080
啟動時間:2020/3/15 14:05:48
線程數:15
Process process = Process.GetProcessById(5080);
Console.WriteLine("程序名字:" +process.ProcessName);
Console.WriteLine("線程數" + process.Threads.Count);
Console.WriteLine("啟動時間" + process.StartTime);
GetProcessesByName
GetProcessesByName
- 靜态方法
- 傳回一個包含所有關聯程序的數組。
- (1)擷取本地計算機上指定名稱的程序
-
Process[] myProcesses = Process.GetProcessesByName("程序名稱");
-
- (2)擷取遠端計算機上指定名稱的程序
-
Process[] myProcesses =Process.GetProcessesByName("遠端程序名稱",remoteMachineName);
-
- (1)擷取本地計算機上指定名稱的程序
Process[] processes = Process.GetProcessesByName("notepad");
foreach (var process in processes)
{
Console.WriteLine("程序名字:" + process.ProcessName);
Console.WriteLine("程序ID:" + process.Id);
Console.WriteLine("線程數" + process.Threads.Count);
Console.WriteLine("啟動時間" + process.StartTime);
}
停止程序
停止程序的兩種方法
-
: 有圖形界面CloseMainWindow + Close(釋放資源)
-
: 所有程式Kill + WaitForExit(等待退出)
若程序正要終止的同時調用Kill方法,可能會引發異常,是以調用時最好使用try/catch語句。
Process類提供的相關方法和屬性
Kill方法和CloseMainWindow方法
- 前者用于強行終止程序,後者隻是“請求”終止程序。
HasExited屬性
- HasExited屬性用于判斷啟動的程序是否已停止運作。
WaitForInputIdle方法
- 僅适用于具有使用者界面的程序,它可以使Process等待關聯程序進入空閑狀态。
WaitForExit方法
- 設定等待關聯程序退出的時間
Process[] processes = Process.GetProcessesByName("notepad");
foreach (var item in processes)
{
item.Kill();
item.WaitForExit();
}