演练:管理 Windows 进程
更新:2007 年 11 月
此主题中的过程将演练创建进程、在进程停止时作出响应以及停止进程所涉及的步骤。在第一部分中,将创建一个 Windows 应用程序,它使用 Button 控件来启动和停止记事本进程。您将逐一启动记事本的若干实例,然后将这些实例作为一组同时停止。在第二部分,将创建一个控制台应用程序,它枚举在计算机上运行的进程。
有关使用 Process 组件与系统进程交互的更多信息,请参见 关于监视和管理 Windows 进程的介绍。
说明: |
---|
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。 |
创建应用程序
在“新建项目”对话框中,创建 Visual Basic、Visual C# 或 Visual J#“Windows 应用程序”。
在 Form1 设计器打开的情况下,单击“工具箱”中的“Windows 窗体”选项卡,然后向该窗体中添加两个按钮。
在“属性”窗口中,更改下列属性:
控件
属性
值
Button1
Name
ButtonStart
Text
启动进程
Button2
Name
ButtonStop
Text
停止进程
单击“工具箱”中的“组件”选项卡,然后将 Process 组件的一个实例拖到设计器图面。
将该组件命名为 myProcess。
启动 Notepad.exe 进程
在 Process 组件实例的“属性”窗口中,展开 StartInfo 属性,然后将 FileName 属性设置为 notepad.exe。
双击“开始”按钮以访问代码编辑器,然后将下面的代码添加到 ButtonStart_Click() 事件中:
myProcess.Start
myProcess.Start();
保存所有文件,然后生成并运行应用程序。
单击几次“启动进程”按钮。每次单击都将看到“记事本”的单独的实例。
安全说明: 如果在部分信任的上下文中运行,则该进程可能会因特权不足而引发 SecurityException 异常。有关更多信息,请参见代码访问安全性基础知识。
逐一关闭各个记事本应用程序。
关闭 Form1 应用程序。
关闭 Notepad.exe 进程的所有当前实例
访问针对 Form1 的代码编辑器。
在“设计”视图中,双击“停止”按钮,访问 ButtonStop_Click() 过程。
添加下面的代码,关闭“记事本”的当前实例。
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(); } }
保存所有文件,然后生成并运行应用程序。
单击“启动进程”按钮启动几个“记事本”实例。
单击“停止进程”按钮,立即关闭所有运行的“记事本”实例。
关闭 Form1 应用程序。
在下一个过程中,将冻结代码,直到进程完成。
将组件配置为等待 Notepad 进程完成运行
访问针对 Form1 的代码编辑器。
修改代码,在其中添加一行代码,从而使关闭每个窗口之前暂停片刻。
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 秒钟,然后才关闭进程的下一个实例。
关闭 Form1 应用程序。
在演练的这一部分,将创建新的控制台应用程序,该应用程序将检索并列出本地计算机上的进程。
枚举计算机上的进程
创建新的“控制台应用程序”项目。
若要枚举计算机上的进程,请打开代码编辑器,然后修改 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); }
保存所有文件,然后生成并运行应用程序。
该应用程序将打开一个控制台窗口,该窗口包含计算机上当前运行的所有进程的列表。调用 Sleep 将使控制台在关闭前暂停 5 秒钟。
说明: 如果调用 GetProcesses 或 GetProcessesByName,而且在进行下一次调用前,一个返回的进程已完成,则可能在这两个过程中收到异常。在这种情况下,将收到指出进程不存在的异常。