天天看點

程序管理(啟動程序、擷取程序、關閉程序)

程序管理

在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元件關聯

啟動程序的兩種方法

  1. 執行個體化啟動
    • 建立Process類的執行個體
    • StartInfo屬性指定要運作的應用程式名稱以及傳遞的參數
    • Start方法啟動該程序
  2. 直接調用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

  • 靜态方法
  • 根據程序 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

  • 靜态方法
  • 傳回一個包含所有關聯程序的數組。
    • (1)擷取本地計算機上指定名稱的程序
      • Process[] myProcesses = Process.GetProcessesByName("程序名稱");

    • (2)擷取遠端計算機上指定名稱的程序
      • Process[] myProcesses =Process.GetProcessesByName("遠端程序名稱",remoteMachineName);

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();
            }