C#监控外部程序运行状态与关闭事件实现

青禾
青禾
发布时间:2026-10-14 | 3人浏览过
原创

在C#软件开发中,有时需要通过主程序监控另一个外部程序的运行或关闭状态。本文将演示如何利用System.Diagnostics.Process类来轮询特定进程是否存在,并订阅其终止事件,以便在目标程序退出时执行预设的处理逻辑。

引入命名空间与声明

首先,需在文件中引用System.Diagnostics命名空间,以便访问Process类用于管理系统进程操作。接着,在类级别声明一个数组变量来存储查找到的进程对象。

复制代码
using System.Diagnostics;

// 用于存储查找到的外部程序进程数组
private Process[] MyProcesses;

核心监控逻辑

为了实现实时监控,通常建议将检查逻辑放入定时器(Timer)的事件处理方法中,按一定间隔(如每秒或数秒)扫描一次。以下是具体的步骤说明:

第1步:获取指定名称的进程列表

利用Process.GetProcessesByName方法,传入目标进程的 executable name(不含扩展名),即可获取该程序当前运行的所有进程实例。这一步能判断目标软件是否正在运行。

复制代码
// 此处以 "SajetManager" 为例,替换为实际需要监控的程序名称
MyProcesses = Process.GetProcessesByName("SajetManager");
foreach (Process myprocess in MyProcesses) {
    // 可选:记录当前找到的进程名称,用于调试或日志输出
    textBox1.Text += myprocess.ProcessName + "\r\n";
    
    if (myprocess.ProcessName.ToLower() == "sajetmanager")
    { ... }

第2步:配置并订阅进程退出事件

当遍历到目标进程时,需要开启事件触发功能,即设置EnableRaisingEvents属性为true。随后,关联一个事件处理方法来处理Exited事件。这样,一旦该进程被关闭,系统便会调用对应的回调函数。

复制代码
if (myprocess.ProcessName.ToLower() == "sajetmanager")
{
    MessageBox.Show("SajetManager");
    
    // 关键设置:允许进程抛出退出事件
    myprocess.EnableRaisingEvents = true;
    
    // 绑定自定义的事件处理方法,当程序关闭时触发
    myprocess.Exited += new EventHandler(myprocess_Exited);
}

第3步:编写进程关闭时的处理回调

定义上述绑定的事件处理方法myprocess_Exited。在这个方法内部,可以编写任何在目标程序关闭后想要触发的业务逻辑,例如弹出提示、保存数据或重启服务等。

复制代码
private void myprocess_Exited(object sender, EventArgs e)
{
    // 这里执行当被监控程序关闭后需要进行的处理
    MessageBox.Show("SajetManager close");
}

注意事项与排错

  • 进程名称匹配:GetProcessesByName区分大小写情况取决于操作系统和运行时环境,但在C#中对字符串比较建议使用.ToLower()统一转义后对比,以防止因大小写导致匹配失败。
  • 权限问题:如果外部程序是以管理员权限运行的,而你的监控程序是普通用户权限,可能无法正确获取该进程或订阅其事件。此时需要确保监控程序提升权限或在相同权限环境下运行。
  • 资源释放:如果在轮询过程中发现进程已经结束但仍持有旧的Process对象引用,建议在下次循环重新获取最新的进程列表。

以上就是使用C# Process类监控外部程序运行状态的详细内容,更多关于C#进程管理与系统编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表