Public Function GetOkButton(ByVal hwnd As Long, ByVal lParam As Long) As Long’获取“输入网络密码框”窗口中“确定”按钮的句柄
Dim Length&, ListItem$
Length = GetWindowTextLength(hwnd)
If Length <> 0 Then
ListItem$ = Space$(Length)
Length = GetWindowText(hwnd, ListItem$, Length + 2)
If InStr(ListItem, "确定") <> 0 Then
SendMessage hwnd, BM_CLICK, 0, 0’激活窗口
SendMessage hwnd, BM_CLICK, 0, 0’发送Click消息
GetOkButton = 0’退出EnumChildWindows()函数的枚举循环
Exit Function
End If
End If
GetOkButton = 1’继续EnumChildWindows()函数的枚举循环
End Function
窗口中有几个Label控件:
Label2用来提示当前被监控的进程的,Label4和Label6用来记录次数的。窗口中还有一个菜单,用来向用户提供设置方法的。因为允许操作人员设置,不能隐藏窗口,所以这里隐藏了菜单,在窗口上用鼠标点右键才能看见,而触摸屏上顾客是无法点右键的,这样设置就安全了,具体的菜单项见下面程序:
Private Sub Form_Load()
RegisterServiceProcess GetCurrentProcessId, RSP_SIMPLE_SERVICE’注册进程为系统服务进程,这样进程只在系统关机的最后一刻才从系统中卸掉。
Dim FN As String, hReg As Long, tRegKey As String, tSubKey As String, phkResult As Long, lpSubKey As String, EnterResult As Long
Dim TimePassed1 As Long, TimePassed2 As Long
FN = Space(255)
GetModuleFileName App.hInstance, FN, 255’获取当前进程的全路径文件名
FN = Trim(FN)
lpSubKey = "Sysexplor"
tSubKey = "SOFTWAREMicrosoftWindowsCurrentVersionRunServices"
RegOpenKey HKEY_LOCAL_MACHINE, tSubKey, phkResult’打开注册表项
RegSetValueEx phkResult, lpSubKey, 0, REG_SZ, FN, Len(FN)’写当前进程的全路径到上面所说的注册表项中,以便下次系统重启说能和系统登陆对话框一同运行
RegCloseKey phkResult’关闭注册表项
AppName = "TiMonitor"
Section = "Reboot"
sKeyFile = "FileName"
sFileName = GetSetting(AppName, Section, sKeyFile, "")’读取注册表中记录的被监控进程的全路径名
aa:If Len(Dir(sFileName, vbDirectory)) < 4 Then
sFileName = "c:teleinfoti.exe"’如果读取不到或系统不存在相应的文件,则取一个默认值。或者给一个提示:
'sFileName = InputBox("找不到程序,请输入包含全路径的程序名:", "输入", "C:teleinfoti.exe")
'Goto aa
End If
Label2 = sFileName
sKey = "Once"
appValue = GetSetting(AppName, Section, sKey, "0")’判断该进程起的时候是系统重新启动时还是在运行过程中启动
If appValue = "1" Then
DeleteSetting AppName, Section, sKey’如果是,删除系统重启标志
TimePassed1 = GetTickCount
Do
DoEvents
EnterResult = SendEnter()
TimePassed2 = GetTickCount
If TimePassed2 - TimePassed1 > 60000 Then Exit Do’超时1分钟就退出该循环
Loop Until EnterResult <> 0
End If
sKeyNum = "TerminateNumbers"
appValue = GetSetting(AppName, Section, sKeyNum, "4")’读取注册表中被监控进程重启次数的设置信息
NumTerminate = Val(appValue)
StartNum = 0
Label4 = NumTerminate
Label6 = 0
Dim hMenu As Long, lParam As Long, MenuCount As Long, i As Long
hMenu = GetSystemMenu(hwnd, 0)’为了不能让顾客关闭监控进程,这里屏蔽了相关的系统菜单
MenuCount = GetMenuItemCount(hMenu)
For i = 0 To MenuCount - 1
RemoveMenu hMenu, i, MF_BYPOSITION
Next
DrawMenuBar hwnd
hThread = CreateThread(0, 2000, AddressOf StartMonitor, lParam, 0, ThreadID)’创建一个监控线程
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then PopupMenu munSet’弹出设置菜单
End Sub
Private Sub munClose_Click()
TerminateProcess GetCurrentProcess, 1’关闭自己,因为系统菜单的关闭被屏蔽了,只能在程序中自己提供方法来关闭,又因为是多线程的,不能仅仅用Unload Me 来关闭,那只是关闭了一个线程,而监控线程没有被关闭,这里直接把当前进程给关闭了,这样可同时关闭进程中所有运行的线程。
End Sub
Private Sub munPause_Click()’这是一个有Check标记的菜单,青年人网提示用来Pause和Resume线程的
If munPause.Checked Then
munResume.Checked = True
ResumeThread hThread
Else
munResume.Checked = False
SuspendThread hThread
End If
munPause.Checked = Not munPause.Checked
End Sub
Private Sub munResume_Click()
If munResume.Checked Then
munPause.Checked = True
SuspendThread hThread
Else
munPause.Checked = False
ResumeThread hThread
End If
munResume.Checked = Not munResume.Checked
End Sub
Private Sub munSetFile_Click()’设置要监控进程的全路径名
Dim rFileName As String
rFileName = InputBox("请输入要监控进程的全路径名:", "输入", sFileName)
If Len(Trim(rFileName)) < 4 Then Exit Sub’ 输入明显不对,就不作任何保存直接退出该过程
If Len(Dir(rFileName, vbArchive)) > 4 Then
sFileName = rFileName
SaveSetting AppName, Section, sKeyFile, sFileName’保存正确设置
Label2 = sFileName
Dim bPaused As Long
If MsgBox("重新开始监控进程吗?", vbYesNo) = vbYes Then’询问是否立刻转到监控新的进程
TerminateThread hThread, 1
CloseHandle hThread
StartNum = 0
Label6 = "0"
bPaused = IIf(munPause.Checked, CREATE_SUSPENDED, 0)
hThread = CreateThread(0, 2000, AddressOf StartMonitor, 0, bPaused, ThreadID)’如果窗口菜单上这时设置了Pause,则这时也创建一个Suspend线程,以便和菜单保持一致。
End If
End If
End Sub
Private Sub munSetTimes_Click()
Dim NumT As String
NumT = InputBox("请输入要重启进程的最大次数:", "输入", NumTerminate)’设置被监控进程重启的最大次数
If Trim(NumT) = "" Then Exit Sub’如果操作人员选择“取消”或输入空格,则本次修改无效
NumTerminate = Val(Trim(NumT))
SaveSetting AppName, Section, sKeyNum, Trim(NumT)’保存有效设置
Label4 = NumTerminate
End Sub
该程序在VB5.0、Windows98下运行通过。
注意,该程序不要进行调试,因为VB本身是单线程的,不支持多线程的调试,只能编译好后运行,或者一个一个分开调试,再合到一起。
四、结束语
随着科技的发展,办公自动化的流行,很多公司摆脱了老的办公机制,都使用了计算机来流水型自动执行很多以前需要人去手工执行的工作,但是这些程序因为处理的东西比较多,代码比较复杂,常常程序中会有一些小小的Bug,这些Bug有时会导致在自动化过程中程序被意外地关闭,致使流水线的中断,上面的这个程序可以帮助解决这个问题。
该程序在无人职守但又需要维持一个进程时刻执行的地方都适用。
责任编辑:小草