2024年3月25日发(作者:)

用VB编写监视指定进程的程序

作者: 徐原

一、前言

有些对外营业的公司在大厅中都有一个触摸屏,以供客户查询公司的信息,可是通常

查询程序都很大,而且很复杂,这样在连续长时间使用后难免会出现错误以致程序中途退

出,这时就要工作人员来重新启动那个程序,而且有时候很忙不一定能有专人守在这个地

方。其实可以用一个程序来专门处理这种情况的。我们局电信营业前台的多媒体查询系统

也常常会出现这样的问题,下面是本人开发出来的监控程序处理思路。

二、实现思路及关键技术

要防止程序中途退出,就需要另外的一个程序专门对要监控的进程进行时刻不停的监

控,检测到被监控的进程退出了就重新启动它。但是有时候可能是操作系统出了问题,不

能简单地重复启动要监控的进程,在重启了一定的次数后被监控进程仍然退出,那就需要

重新启动操作系统了,以便使操作系统中的环境参数等重新初始化,然后再运行监控进程

并启动被监控的进程。

监控进程的存在最好不能影响被监控的进程,监控进程启动的时候要进行判断,看当

前状况下被监控的进程有没有起来,如果起来了就获取其进程句柄并进行监控,如果没有

起来则使之起来并监控。这里判断一个被监控的进程有没有起来不能简单地通过查找窗口

标题来实现,因为窗口标题在程序内部可能是根据运行的时刻和条件动态地改变的,而且

别的进程也可以和可能去改变被监控进程的窗口标题。程序中使用了

CreateToolhelp32SnapShot()

‘函数通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线

程建立一个快照.说到底,可以获取系统中正在运行的进程信息,线程信息,等

这个API函数遍历系统进程池里的所有进程全路径等信息来查找的,一个进程运行起

来之后,它的路径是不可能被改变的,无论它自己还是别的进程。

为了实现程序的高效率,这里监控进程不是用Timer控件轮寻来检测,而是用API函

数WaitForSingleObject (),同时传入等待时间为无限长(-1),但是这里有个问题,就是

程序在等待的同时被冻结,这样用户在这个时候就无法对该监控程序进行设置操作了,为

了避免这种情况,这里使用了多线程技术,在VB中使用多线程一直是不安全的,在线程

代码中必须不能出任何错误。

要使监控进程能自动启动操作系统,必须要在系统启动的登陆对话框出现的时候该进

程也能运行起来,这可以通过把该进程放入注册表项

HKEY_LOCAL_MACHINESoftWareMicrosoftWindowsCurrentVersionRunSevice

s里来实现。在进程运行起来之后就需要检测登陆对话框,如果找到就发送回车(这里没

设登陆密码,如果有密码,可以修改程序中发送的按键来实现登陆)。但是这里也有可能是

登陆的时候系统设置的不是“网络用户”方式或有用户在屏幕上按了“确定”对话框,程

序不能这这里一直等待一个不可能的事件,所以要在这个地方加以判断,如果等了1分钟

没有找到登陆对话框,程序就继续下面的操作。

三、代码示例