演练:管理 Windows 进程

更新:2007 年 11 月

此主题中的过程将演练创建进程、在进程停止时作出响应以及停止进程所涉及的步骤。在第一部分中,将创建一个 Windows 应用程序,它使用 Button 控件来启动和停止记事本进程。您将逐一启动记事本的若干实例,然后将这些实例作为一组同时停止。在第二部分,将创建一个控制台应用程序,它枚举在计算机上运行的进程。

有关使用 Process 组件与系统进程交互的更多信息,请参见 关于监视和管理 Windows 进程的介绍

说明:

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置

创建应用程序

  1. 在“新建项目”对话框中,创建 Visual Basic、Visual C# 或 Visual J#“Windows 应用程序”。

  2. 在 Form1 设计器打开的情况下,单击“工具箱”中的“Windows 窗体”选项卡,然后向该窗体中添加两个按钮。

  3. 在“属性”窗口中,更改下列属性:

    控件

    属性

    Button1

    Name

    ButtonStart

     

    Text

    启动进程

    Button2

    Name

    ButtonStop

     

    Text

    停止进程

  4. 单击“工具箱”中的“组件”选项卡,然后将 Process 组件的一个实例拖到设计器图面。

  5. 将该组件命名为 myProcess。

启动 Notepad.exe 进程

  1. Process 组件实例的“属性”窗口中,展开 StartInfo 属性,然后将 FileName 属性设置为 notepad.exe。

  2. 双击“开始”按钮以访问代码编辑器,然后将下面的代码添加到 ButtonStart_Click() 事件中:

    myProcess.Start
    
    myProcess.Start();
    
  3. 保存所有文件,然后生成并运行应用程序。

  4. 单击几次“启动进程”按钮。每次单击都将看到“记事本”的单独的实例。

    安全说明:

    如果在部分信任的上下文中运行,则该进程可能会因特权不足而引发 SecurityException 异常。有关更多信息,请参见代码访问安全性基础知识

  5. 逐一关闭各个记事本应用程序。

  6. 关闭 Form1 应用程序。

关闭 Notepad.exe 进程的所有当前实例

  1. 访问针对 Form1 的代码编辑器。

  2. 在“设计”视图中,双击“停止”按钮,访问 ButtonStop_Click() 过程。

  3. 添加下面的代码,关闭“记事本”的当前实例。

    Private Sub ButtonStop_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles ButtonStop.Click
       Dim myProcesses() As Process
       Dim instance As Process
       myProcesses = Process.GetProcessesByName("Notepad")
       For Each instance In myProcesses
          instance.CloseMainWindow()
          instance.Close()
       Next
    End Sub
    
    private void ButtonStop_Click(object sender, System.EventArgs e)
    {
       System.Diagnostics.Process[] myProcesses;
       myProcesses = 
          System.Diagnostics.Process.GetProcessesByName("Notepad");
       foreach (System.Diagnostics.Process instance in myProcesses)
       {
          instance.CloseMainWindow();
          instance.Close();
       }
    }
    
  4. 保存所有文件,然后生成并运行应用程序。

  5. 单击“启动进程”按钮启动几个“记事本”实例。

  6. 单击“停止进程”按钮,立即关闭所有运行的“记事本”实例。

  7. 关闭 Form1 应用程序。

在下一个过程中,将冻结代码,直到进程完成。

将组件配置为等待 Notepad 进程完成运行

  1. 访问针对 Form1 的代码编辑器。

  2. 修改代码,在其中添加一行代码,从而使关闭每个窗口之前暂停片刻。

    Private Sub ButtonStop_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles ButtonStop.Click
       Dim myProcesses() As Process
       Dim instance As Process
       myProcesses = Process.GetProcessesByName("Notepad")
       For Each instance In myProcesses
          instance.CloseMainWindow()
          instance.WaitForExit(3000)
          instance.Close()
       Next
    End Sub
    
    private void ButtonStop_Click(object sender, System.EventArgs e)
    {
       System.Diagnostics.Process[] myProcesses;
       myProcesses = 
          System.Diagnostics.Process.GetProcessesByName("Notepad");
       foreach (System.Diagnostics.Process instance in myProcesses)
       {
          instance.CloseMainWindow();
          instance.WaitForExit(3000);
          instance.Close();
       }
    }
    
  3. 保存所有文件,然后生成并运行应用程序。

  4. 单击“启动进程”按钮启动几个“记事本”实例。

  5. 像前面一样,单击“停止进程”按钮关闭进程。

    您将注意到现在应用程序对每个要停止的进程等待 3 秒钟,然后才关闭进程的下一个实例。

  6. 关闭 Form1 应用程序。

在演练的这一部分,将创建新的控制台应用程序,该应用程序将检索并列出本地计算机上的进程。

枚举计算机上的进程

  1. 创建新的“控制台应用程序”项目。

  2. 若要枚举计算机上的进程,请打开代码编辑器,然后修改 Main 方法:

    Sub Main()
       Dim processes() As Process
       Dim instance As Process
       processes = Process.GetProcesses
       For Each instance In processes
          Console.WriteLine(instance.ProcessName)
       Next
       System.Threading.Thread.Sleep(5000)
    End Sub
    
    static void Main()
    {
       System.Diagnostics.Process[] processes;
       processes = System.Diagnostics.Process.GetProcesses();
       foreach (System.Diagnostics.Process instance in processes)
       {
          Console.WriteLine(instance.ProcessName);
       }
       System.Threading.Thread.Sleep(5000);
    }
    
  3. 保存所有文件,然后生成并运行应用程序。

    该应用程序将打开一个控制台窗口,该窗口包含计算机上当前运行的所有进程的列表。调用 Sleep 将使控制台在关闭前暂停 5 秒钟。

    说明:

    如果调用 GetProcessesGetProcessesByName,而且在进行下一次调用前,一个返回的进程已完成,则可能在这两个过程中收到异常。在这种情况下,将收到指出进程不存在的异常。

请参见

任务

如何:指定进程

如何:停止进程

其他资源

管理进程